单调栈+线段树——cf1220F
首先考虑初始排列,pi会让周围所有比其大的元素深度+1,所以要求每个点的深度,只要其被覆盖了几次即可
这个覆盖可以通过处理每个元素的左右边界(单调栈O(n))+线段树区间更新(Ologn(n))来做
然后是将排列最左边一个元素移到最右边:
在左边删元素pi,只会让pi右边所有比其大的元素深度-1,
在右边加上元素pi,会让pi左边比其大的元素深度+1
这种循环左右移动,需要频繁更改线段树的下标,不好操作,所以我们一开始直接用一个两倍的数组来建立线段树,只要查询时查询长度为n即可
#include<bits/stdc++.h>
#include<stack>
using namespace std;
#define N 400005 int n,a[N],L[N],R[N]; void work(){
stack<int>stk;
a[*n+]=;
for(int i=;i<=*n+;i++){
if(stk.empty()){stk.push(i);continue;}
while(stk.size() && a[stk.top()]>=a[i]){
R[stk.top()]=i-;
stk.pop();
}
stk.push(i);
} while(stk.size())stk.pop();
a[]=;
for(int i=*n;i>=;i--){
if(stk.empty()){stk.push(i);continue;}
while(stk.size() && a[stk.top()]>=a[i]){
L[stk.top()]=i+;
stk.pop();
}
stk.push(i);
}
} #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int lazy[N<<],Max[N<<];
void pushdown(int rt){
if(lazy[rt]){
lazy[rt<<]+=lazy[rt];Max[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];Max[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void update(int L,int R,int v,int l,int r,int rt){
if(L<=l && R>=r){Max[rt]+=v;lazy[rt]+=v;return;}
int m=l+r>>;
pushdown(rt);
if(L<=m)update(L,R,v,lson);
if(R>m)update(L,R,v,rson);
Max[rt]=max(Max[rt<<],Max[rt<<|]);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)return Max[rt];
int m=l+r>>,res=;
pushdown(rt);
if(L<=m)res=max(res,query(L,R,lson));
if(R>m)res=max(res,query(L,R,rson));
return res;
} int main(){
cin>>n;
for(int i=;i<=n;i++)cin>>a[i];
for(int i=;i<=n;i++)a[i+n]=a[i]; work();//处理出每个元素可以控制的范围 for(int i=;i<=n;i++)
update(L[i],R[i],,,*n,); int ans=query(,n,,*n,),pos=;
for(int i=;i<n;i++){
int s=i,t=i+n;
update(L[s],R[s],-,,*n,);//把s从左端删掉
update(L[t],R[t],,,*n,);//把t加入右端
int res=query(s+,t,,*n,);
if(res<ans){
ans=res,pos=i;
}
} cout<<ans<<" "<<pos<<'\n';
return ;
}
单调栈+线段树——cf1220F的更多相关文章
- 洛谷P4198 楼房重建 单调栈+线段树
正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,, ...
- 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)
2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...
- 2019南昌网络赛-I(单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...
- 网络赛 I题 Max answer 单调栈+线段树
题目链接:https://nanti.jisuanke.com/t/38228 题意:在给出的序列里面找一个区间,使区间最小值乘以区间和得到的值最大,输出这个最大值. 思路:我们枚举每一个数字,假设是 ...
- 南昌邀请赛I.Max answer 单调栈+线段树
题目链接:https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value of a in ...
- [CF1083D]The Fair Nut’s getting crazy[单调栈+线段树]
题意 给定一个长度为 \(n\) 的序列 \(\{a_i\}\).你需要从该序列中选出两个非空的子段,这两个子段满足 两个子段非包含关系. 两个子段存在交. 位于两个子段交中的元素在每个子段中只能出现 ...
- 【CF671E】Organizing a Race 单调栈+线段树
[CF671E]Organizing a Race 题意:n个城市排成一排,每个城市内都有一个加油站,赛车每次经过第i个城市时都会获得$g_i$升油.相邻两个城市之间由道路连接,第i个城市和第i+1个 ...
- 南昌网络赛 I. Max answer (单调栈 + 线段树)
https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...
随机推荐
- 每天一个Linux命令:rm(5)
rm rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变 注意:使用rm命令要格外小心.因为 ...
- Mac上的Apache 开启,停止,重启
sudo apachectl -k start 启动 sudo apachectl -k stop 停止 sudo apachectl -k restart 重启
- Ceph介绍及原理架构分享
https://www.jianshu.com/p/cc3ece850433 1. Ceph架构简介及使用场景介绍 1.1 Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能. ...
- element-ui弹窗实现自定义宽度
<el-dialog :title="title" :visible.sync="hiddenDialogCommon" :width="wid ...
- Linux内核学习--写一个c程序,并在内核中编译,运行
20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...
- haproxy笔记
haproxy安装.启动.日志配置 方法1:#安装 yum install haproxy -y #日志配置 sed -i 's/^#$ModLoad imudp/$ModLoad imudp/g' ...
- ios和android适配
一些情况下对非可点击元素如(label,span)监听click事件,ios下不会触发 解决方案:css增加cursor:pointer; 三星手机遮罩层下的input.select.a等元素可以被点 ...
- MySQL 小数处理函数 round 和 floor
一. 在mysql中,round函数用于数据的四舍五入,它有两种形式: 1.round(x,d) ,x指要处理的数,d是指保留几位小数 这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的 ...
- 二.通过jenkins对系统的监控(1)
说明:通过jenkins定时请求系统,判断系统是否挂了. 注:windows环境 1.新建一个自由风格的项目. 2.构建触发器选择定时构建. 3.执行windows批处理命令 4.构建后操作,发邮件 ...
- ansible 远程执行时提示 command not found 问题
问题 最近在学习 ansible ,在使用普通用户远程执行 ip a 命令是发现提示错误:/bin/sh: ip: command not found. 原因 command not found 命令 ...