首先考虑初始排列,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的更多相关文章

  1. 洛谷P4198 楼房重建 单调栈+线段树

    正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,, ...

  2. 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)

    2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...

  3. The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...

  4. 2019南昌网络赛-I(单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...

  5. 网络赛 I题 Max answer 单调栈+线段树

    题目链接:https://nanti.jisuanke.com/t/38228 题意:在给出的序列里面找一个区间,使区间最小值乘以区间和得到的值最大,输出这个最大值. 思路:我们枚举每一个数字,假设是 ...

  6. 南昌邀请赛I.Max answer 单调栈+线段树

    题目链接:https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value of a in ...

  7. [CF1083D]The Fair Nut’s getting crazy[单调栈+线段树]

    题意 给定一个长度为 \(n\) 的序列 \(\{a_i\}\).你需要从该序列中选出两个非空的子段,这两个子段满足 两个子段非包含关系. 两个子段存在交. 位于两个子段交中的元素在每个子段中只能出现 ...

  8. 【CF671E】Organizing a Race 单调栈+线段树

    [CF671E]Organizing a Race 题意:n个城市排成一排,每个城市内都有一个加油站,赛车每次经过第i个城市时都会获得$g_i$升油.相邻两个城市之间由道路连接,第i个城市和第i+1个 ...

  9. 南昌网络赛 I. Max answer (单调栈 + 线段树)

    https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...

随机推荐

  1. 存储过程中的in out in out 三种类型的参数

    in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变. out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程 in out 表示高参数可以 ...

  2. centos7实现ssh免秘钥分发

    centos7的秘钥分发与centos6的秘钥分发还有点不一样,今天在给朋友排坑,在网上找了半天,也没有一个好解决方法,就只能自己研究,今天就把我解决的问题分享出来:那么如何实现centos7秘钥分发 ...

  3. zabbix 如何监控php-fpm?

    zabbix监控php-fpm主要是通过nginx配置php-fpm的状态输出页面,在正则取值.要nginx能输出php-fpm的状态首先要先修改php-fpm的配置,没有开启nginx是没有法输出p ...

  4. rabbitmq集群-2

    rabbitmq集群 原文地址:https://www.cnblogs.com/lion.net/p/5725474.html rabbitmq集群介绍 rabbitmq有3种模式,但集群模式是2种. ...

  5. docker常见启动参数

    dockerd启动参数详解: dockerd \ --bip \ #设置docker0网段 --selinux-enabled=false \ #关闭selinux --insecure-regist ...

  6. 1.zabbix编译安装(环境lnmp)

    zabbix服务端安装 1.使用脚本安装.脚本内容如下.安装完用http://192.168.159.20/zabbix #!/bin/bash #使用说明,此版本是针对程序安装路径不在/opt/下的 ...

  7. 论一个PHP项目上线的注意点

    一.后端问题 服务器配置要跟上流量 预估QPS时要给足未知流量的空间 后端数据库设计要根据项目大小来相对应,小型流量单表就可以,但是中大型要分库分表 在处理执行修改的操作时一定要多一层判断(判断是否已 ...

  8. Cocos2d-x 发布 Android

    Cocos2d-x 发布 Android 前置需求: Android NDK Android SDK OR Eclipse ADT Bundle Android AVD target installe ...

  9. vue对象侦测

    http://blog.csdn.net/yihanzhi/article/details/74200618 数组:this.$set(this.arr,index,value)

  10. android 拖拉和放大

    public class MainActivity extends Activity { private ImageView imageView; @Override public void onCr ...