单调栈+线段树——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 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...
随机推荐
- 【MVC】Spring WebFlux
一.什么是 Spring WebFlux 下图截自 Spring Boot 官方网站: 结合上图,在了解 Spring WebFlux 之前,我们先来对比说说什么是 Spring MVC,这更有益我们 ...
- 如何在html中添加引用公共模块文件
1.首先需要修改apache的配置文件: 打开httpd.conf 搜索“AddType text/html .shtml” 搜索结果: AddType text/html .shtml .html ...
- 《一头扎进》系列之Python+Selenium框架实战篇7 - 年底升职加薪,年终奖全靠它!Merry Christmas
1. 简介 截止到上一篇文章为止,框架基本完全搭建完成.那么今天我们要做什么呢????聪明如你的小伙伴或者是童鞋一定已经猜到了,都测试完了,当然是要生成一份高端大气上档次的测试报告了.没错的,今天宏哥 ...
- HTML5: HTML5 语义元素
ylbtech-HTML5: HTML5 语义元素 1.返回顶部 1. HTML5 语义元素 语义= 意义 语义元素 = 有意义的元素 什么是语义元素? 一个语义元素能够清楚的描述其意义给浏览器和开发 ...
- Windows-添加环境变量(path)
使用命令提示符(cmd.批处理.Batch..bat)添加环境变量 永久环境变量 命令提示符下修改 注意:要使用管理员身份运行 cmd set PATH=%PATH%;要添加的路径 reg add & ...
- PHP-文件和目录操作
目录操作 创建目录:mkdir(目录地址, 权限, 是否递归创建 = false); 删除目录:rmdir(目录地址);(仅仅可以删除空目录,不支持递归删除) 移动(改名):rename(旧地址, 新 ...
- 【网络是怎么连接的】一、浏览器与HTTP协议
浏览器: 1.生成HTTP消息: 1).网址结构: http://user:password@www.glasscom.com:80/dir/file1.htm 2).HTTP服务基本思路: a).请 ...
- Angularjs实现简单的登陆框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...
- 在webpack4 中利用Babel 7取消严格模式方法
报错信息: Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on stri ...
- [已解决]报错: No module named pip
cmd中敲命令: python -m ensurepip 更新升级pip命令: python -m pip install --upgrade pip