Codeforces Round #709 (Div. 1) C. Skyline Photo dp + 单调栈优化

传送门

文章目录

  • 题意:
  • 思路:

题意:

在这里插入图片描述

思路:

首先一个非常明显的dpdpdp式子就是f[i]=max(f[j]+val(j+1,i))f[i]=max(f[j]+val(j+1,i))f[i]=max(f[j]+val(j+1,i)),其中val(j+1,i)val(j+1,i)val(j+1,i)[j+1,i][j+1,i][j+1,i]中高度最小的美丽值,复杂度O(n2)O(n^2)O(n2),考虑如何来优化这个式子。
我们注意到,[j+1,i][j+1,i][j+1,i]是当前iii的一个后缀,我们jjj[1,i−1][1,i-1][1,i1]枚举的时候,其高度是单调不减的,这启发我们维护一个单调不减的栈,那么对于栈中元素,其管辖的范围就是[stk[top−1],stk[top]−1][stk[top-1],stk[top]-1][stk[top1],stk[top]1],当jjj从这个区间转移的时候,就是maxj=stk[top−1]stk[top]−1(f[j]+b[stk[top]])max_{j=stk[top-1]}^{stk[top]-1}(f[j]+b[stk[top]])maxj=stk[top1]stk[top]1(f[j]+b[stk[top]])
所以我们只需要维护一个fff数组,能快速将他管辖的区间加上b[stk[top]]b[stk[top]]b[stk[top]],并且能快速查询所有f+bf+bf+b的最大值,这个显然可以用线段树来实现。
为什么直接查询非管辖区域的最大值就行了呢?因为在非其管辖的区域内,我们每个位置已经存了f+bf+bf+b的最大值了,只要他还在栈中,那么他的值就不会改变,所以直接取最大值就好啦。

// Problem: C. Skyline Photo
// Contest: Codeforces - Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round)
// URL: https://codeforces.com/problemset/problem/1483/C
// Memory Limit: 256 MB
// Time Limit: 2500 ms
// 
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int a[N],b[N],stk[N],top;
struct Node {int l,r;LL mx,lazy;
}tr[N<<2];void pushup(int u) {tr[u].mx=max(tr[L].mx,tr[R].mx);
}void pushdown(int u) {LL lazy=tr[u].lazy; tr[u].lazy=0;tr[L].mx+=lazy; tr[L].lazy+=lazy;tr[R].mx+=lazy; tr[R].lazy+=lazy;
} void build(int u,int l,int r) {tr[u]={l,r,0};if(l==r) return;build(L,l,Mid); build(R,Mid+1,r);
}void modify(int u,int l,int r,LL val) {if(tr[u].l>=l&&tr[u].r<=r) {tr[u].mx+=val;tr[u].lazy+=val;return ;}pushdown(u);if(l<=Mid) modify(L,l,r,val);if(r>Mid) modify(R,l,r,val);pushup(u);
}LL query(int u,int l,int r) {if(tr[u].l>=l&&tr[u].r<=r) return tr[u].mx;LL ans=-1e15;pushdown(u);if(l<=Mid) ans=max(ans,query(L,l,r));if(r>Mid) ans=max(ans,query(R,l,r));return ans;
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);LL ans=0;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) scanf("%d",&b[i]);build(1,0,n);for(int i=1;i<=n;i++) {if(!top) {modify(1,stk[top],i-1,b[i]);LL mx=query(1,0,i-1);modify(1,i,i,mx);stk[++top]=i;}else {while(top&&a[stk[top]]>a[i]) {modify(1,stk[top-1],stk[top]-1,-b[stk[top]]);top--;}modify(1,stk[top],i-1,b[i]);LL mx=query(1,0,i-1);modify(1,i,i,mx);stk[++top]=i;}}printf("%lld\n",query(1,n,n));return 0;
}
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「数据分析」Sqlserver中的窗口函数的精彩应用之数据差距与数据岛(含答案)...

上一篇介绍过数据差距与数据岛的背景&#xff0c;这里不再赘述&#xff0c;请翻阅上一文。此篇在Sqlserver上给大家演示1000万条记录的计算性能。测试电脑软硬件说明一般般的笔记本电脑&#xff0c;2017年7月&#xff0c;价格&#xff1a;4500。电脑配置数据构造1000万行数据&a…

Codeforces Round #631 (Div. 2) C. Dreamoon Likes Coloring 构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 针灸思维不行&#xff0c;数据结构来凑呗。 一开始做的时候想简单了&#xff0c;一直wawawa&#xff0c;后来想到了hackhackhack样例&#xff0c;开始换思路构造&#xff0c;结果死活想不到…

用象棋的思维趣说IT人的职业发展和钱途

最近我花了不少功夫在学习象棋&#xff0c;也学习了王天一等高手的棋路&#xff0c;感觉IT人的职业和下棋一样&#xff0c;往好了讲&#xff0c;争主动权争实惠只争朝夕&#xff0c;往坏了讲&#xff0c;一步走错得用多步来弥补&#xff0c;如果错误太大未必能弥补回来。在本文…

Codeforces Round #631 (Div. 2) D. Dreamoon Likes Sequences 思维 + 组合数学

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你d,modd,modd,mod&#xff0c;让你求能构造出如下序列aaa的个数模modmodmod&#xff1a; 思路&#xff1a; 首先可以发现aaa的长度不能超过log2dlog_2dlog2​d&#xff0c;因为如果存在两个aaa的二进制…

基于 Roslyn 实现动态编译

基于 Roslyn 实现动态编译Intro之前做的一个数据库小工具可以支持根据 Model 代码文件生成创建表的 sql 语句&#xff0c;原来是基于 CodeDom 实现的&#xff0c;最近改成使用基于 Roslyn 去做了。实现的原理在于编译选择的Model 文件生成一个程序集&#xff0c;再从这个程序集…

Codeforces Round #212 (Div. 2) C. Insertion Sort 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤5000n\le5000n≤5000 思路&#xff1a; 从dpdpdp题集中看到的&#xff0c;一看n≤5000n\le5000n≤5000&#xff0c;这不就乱搞就行了&#xff0c;哪有什么dpdpdp&#x1f986;。 看到冒泡排序&#xff0…

[Abp vNext 源码分析] - 4. 工作单元

一、简要说明统一工作单元是一个比较重要的基础设施组件&#xff0c;它负责管理整个业务流程当中涉及到的数据库事务&#xff0c;一旦某个环节出现异常自动进行回滚处理。在 ABP vNext 框架当中&#xff0c;工作单元被独立出来作为一个单独的模块(Volo.Abp.Uow)。你可以根据自己…

使用 Cake 推送 NuGet 包到 AzureDevops 的 Artifacts 上

大家好&#xff0c;我最近在想如何提交代码的时候自动的打包 NuGet 然后发布到 AzureDevOps 中的 Artifacts&#xff0c;在这个过程中踩了很多坑&#xff0c;也走了很多弯路&#xff0c;所以这次篇文章就是将我探索的结果和我遇到的一些问题整理分享给大家。我的上一篇关于 CI/…

了解Kubernetes主体架构(二十八)

前言 Kubernetes的教程一直在编写&#xff0c;目前已经初步完成了以下内容&#xff1a;1&#xff09;基础理论2&#xff09;使用Minikube部署本地Kubernetes集群3&#xff09;使用Kubeadm创建集群接下来还会逐步完善本教程&#xff0c;比如Helm、ELK、Windows Serv…

Codeforces Round #632 (Div. 2) F. Kate and imperfection 数论 + 贪心

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤5e5n\le5e5n≤5e5 思路&#xff1a; 首先有个显然的结论&#xff1a;当往集合中加入一个数xxx的时候&#xff0c;如果存在d∣xd|xd∣x且ddd不在集合中&#xff0c;那么加入ddd一定比加入xxx更优。 也就是…

.NET开发框架(二)-框架功能简述

本框架为响应式SPA框架&#xff0c;支持PC与手机端的屏幕自适应。手机展示效果视频在文章末尾查看。框架入口地址&#xff1a;http://letyouknow.net/1、框架登录界面&#xff0c;输入账号与密码&#xff0c;点击立即登录2、框架主界面&#xff0c;左-右结构&#xff0c;左边为…

Codeforces Round #632 (Div. 2) E. Road to 1600 构造好题

传送门 文章目录题意&#xff1a;思路题意&#xff1a; 直接白嫖 思路 首先不难发现&#xff0c;n≤2n\le2n≤2的时候是无解的。 现在我们来构造n3n3n3的情况&#xff0c;通过打表可以发现如下矩阵是符合题目要求的&#xff1a; 179325486\begin{array}{ccc} 1&7&9…

SiteServer CMS 新版本 V6.11(2019年7月1日发布)

欢迎来到 SiteServer CMS V6.11版本&#xff08;.NET CORE V7.0预览版本将推迟至2019年9月1日发布&#xff09;&#xff0c;经过两个月的连续迭代开发&#xff0c;V6.11 版本新增了采集插件以及多项BUG修复&#xff1a;SS.Gather 页面采集插件页面采集插件将在V6.11版本中正式提…

P1020 [NOIP1999 普及组] 导弹拦截 Dilworth定理 + dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 对于第一问直接输出最长不严格下降子序列即可&#xff0c;第二问是Dilworth定理&#xff0c;变形比较多&#xff0c;之前也写过类似的&#xff0c;这里贴个证明。 //#pragma GCC optimiz…

参数传递机制之JWT

1. 什么是 JWTJWT 其全称为&#xff1a;JSON Web Token&#xff0c;简单地说就是 JSON 在 Web 上的一种带签名的标记形式。官方的定义如下&#xff1a;JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.…

Codeforces Round #709 (Div. 1) B. Playlist 链表维护 + bfs

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 紧跟刘爷脚步补题。 不难想到用链表维护下一个数是什么&#xff0c;这样就跟以前做过的一个题差不多了&#xff0c;首先将初始的时候删掉的点的前一个点即为题目中的AAA入队&#xff0c;让…

浅谈ASP.NET Core中IOC与DI的理解和使用

说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生&#xff0c;早前&#xff0c;自己也有尝试过去了解这两个东西&#xff0c;但是一直觉得有点很难去理解&#xff0c;总觉得对其还是模糊不清&#xff0c;所以&#xff0c;趁着今天有空&#xff0c;就去把两个概念捋清…

一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE

这是一个.net下操作数据库(结构数据库)的工具类&#xff0c;支持sqlserver、oracle、mysql、postgres、sqlite、access等常见数据库。注意&#xff1a;它并不是一个orm工具(常见的orm框架如&#xff1a;EF、Dapper等)。2.1 引入DBUtil依赖1. 首先打开vs(推荐vs2019)&#xff0c…

Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components? 暴力 + 补图的遍历

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5。 思路&#xff1a; 这是题是我上个题的一部分&#xff0c;算是个小知识点&#xff0c;暴力能过。 直接维护一个setsetset&#xff0c;让后遍历所有点&#xff…

初探System.Threading.Channels

。System.Threading.Channels是.Net Core基础类库中实现的一个多线程相关的库&#xff0c;专门处理数据流相关的操作&#xff0c;用来在生产者和订阅者之间传递数据&#xff08;不知道可不可以理解为线程间传递数据&#xff0c;我把它类比成了Go语言中的Channel&#xff09;&am…