Codeforces 1108 E2(线段树+思维)
传送们
题意:
给你一个长度为nnn的数列bbb、以及mmm个区间。
你可以选取111个或多个这样的区间aia_iai,使得令区间aia_iai所对应的所有值bib_ibi都减111。你最终要使得maxi=1nbi−mini=1nbi\max\limits_{i=1}^{n}b_i - \min\limits_{i=1}^{n}b_ii=1maxnbi−i=1minnbi
最大。
问你方案数以及最大值。
题目分析:
在E1E1E1中,我们可以通过这个题中优美的性质,对于每一个区间aia_iai,通过枚举在这个区间的以及不在这个区间的两个点,我们就可以用O(b2m)O(b^2m)O(b2m)的时间复杂度进行求解。
但是在这个题中,nnn的范围在10510^5105的级别,因此我们需要用一些数据结构进行优化。
我们考虑这几种情况,对于每一个区间操作,如果区间内的最小值恰好在要更新的区间内,而最大值不在,则此时答案必定更优;如果最小值和最大值恰在要更新的区间内,则答案不变;如果最大值在而最小值不在,则答案必定更差。
至此,我们可以发现,要使得答案不会变差,当且仅当最小值恰好在要更新的区间内。
但是我们目前并不知道哪一个点作为最小值点更优,因此我们可以枚举最小值点的位置pospospos。根据我们之前的分析,最小值点能够防止答案变差,因此那些能够把我们所枚举的pospospos包含的区间必定要更新。而一个区间要包含一个点,则这个区间至少是那些以该点为起始点的区间。因此我们只需要在枚举最小值点位置的过程中,不断的进行区间−1-1−1即可。
而我们需要注意的是,在我们枚举的过程中,倘若我们之前更新的某一个区间不能包含当前的位置,我们需要把之前的影响消去,否则会导致将区间的最大值也减111,导致答案不正确。因此,我们只需要在之前枚举的过程的最后,把以当前位置pospospos为结尾的所有区间的影响消去即可。
因为存在区间更新以及区间求最大值,因此我们可以用线段树进行维护。
总的时间复杂度为O(nlogn)O(nlogn)O(nlogn)
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
typedef pair<int,int>pll;
pll q[maxn];
int a[maxn];
vector<int>vec1[maxn];
vector<int>vec2[maxn];
vector<int>res;struct Tree{int add,maxx;
}tr[maxn<<2];
void push_up(int rt){tr[rt].maxx=max(tr[rt<<1].maxx,tr[rt<<1|1].maxx);
}
void push_down(int rt){if(tr[rt].add){tr[rt<<1].maxx+=tr[rt].add;tr[rt<<1|1].maxx+=tr[rt].add;tr[rt<<1].add+=tr[rt].add;tr[rt<<1|1].add+=tr[rt].add;tr[rt].add=0;}
}
void build(int l,int r,int rt){if(l==r){tr[rt].maxx=a[l];return ;}int mid=(l+r)>>1;build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);push_up(rt);
}
void update(int L,int R,int l,int r,int rt,int C){if(L<=l&&R>=r){tr[rt].add+=C;tr[rt].maxx+=C;return ;}int mid=(l+r)>>1;push_down(rt);if(L<=mid) update(L,R,l,mid,rt<<1,C);if(R>mid) update(L,R,mid+1,r,rt<<1|1,C);push_up(rt);
}
int query(int L,int R,int l,int r,int rt){if(L<=l&&R>=r){return tr[rt].maxx;}int mid=(l+r)>>1;push_down(rt);int maxx=-0x3f3f3f3f;if(L<=mid) return max(maxx,query(L,R,l,mid,rt<<1));if(R>mid) return max(maxx,query(L,R,mid+1,r,rt<<1|1));push_up(rt);
}int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);build(1,n,1);for(int i=1;i<=m;i++){scanf("%d%d",&q[i].first,&q[i].second);vec1[q[i].first].push_back(q[i].second);//以该点为起点的区间的右端点vec2[q[i].second].push_back(q[i].first);//以该点为终点的区间的左短点}int maxx=-0x3f3f3f3f;int pos=0;for(int i=1;i<=n;i++){int tmp=a[i];for(int j=0;j<vec1[i].size();j++){update(i,vec1[i][j],1,n,1,-1);//区间更新-1}int res=query(1,n,1,n,1)-query(i,i,1,n,1);//区间求和,等于区间最大值-当前值(最小值)if(maxx<res){maxx=res;pos=i;}for(int j=0;j<vec2[i].size();j++){update(vec2[i][j],i,1,n,1,1);}}cout<<maxx<<endl;int cnt=0;for(int i=1;i<=m;i++){if(q[i].first<=pos&&pos<=q[i].second){res.push_back(i);}cnt++;}cout<<res.size()<<endl;for(auto it:res){cout<<it<<" ";}puts("");
}
转载于:https://www.cnblogs.com/Chen-Jr/p/11007167.html
Codeforces 1108 E2(线段树+思维)相关推荐
- CodeForces - 1326E Bombs(线段树+思维)
题目链接:点击查看 题目大意:给出一个 n 的排列记为 p[ i ] ,现在有一个初始时为空的集合A,对于每个 i 遍历 1 ~ n ,每次的操作如下: 向集合中添加 p[ i ] 如果位置 i 有炸 ...
- Codeforces 786B Legacy (线段树优化建图)
Codeforces 786B Legacy (线段树优化建图) 题意:\(n\)个点,有\(3\)种连边操作:1.将\(u\)指向\(v\):2.将\(v\)指向编号在区间\([l,r]\)的点:3 ...
- 线段树——思维(Codeforces 339D Xenia and Bit Operations/Billboard HDU - 2795)
Codeforces 339D Xenia and Bit Operations vj地址 题意:给出2的n次方个数,每次将现在这个序列中相邻的两个数运算后合并为一个数,得到一个新的序列,这个新序列的 ...
- CodeForces - 1405E Fixed Point Removal(线段树+思维)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,规定当 a[ i ] == i 时,位置 i 可以被删除掉,后面位置会合并上来,现在需要回答 m 次询问,每次询问会问禁用掉后面 x 个 ...
- Sereja and Brackets CodeForces - 380C (线段树+分治思路)
Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...
- 小翔和泰拉瑞亚(线段树+思维)
链接:https://ac.nowcoder.com/acm/contest/3566/D 来源:牛客网 小翔和泰拉瑞亚 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K ...
- CodeForces - 787D - Legacy(线段树优化建图+最短路)
题目链接:点击查看 题目大意:给出 nnn 个点和 mmm 条边,现在需要求从 ststst 开始到所有点的最短路是多少,mmm 条边的给出方式如下: 1uvw1 \ u \ v \ w1 u v w ...
- CodeForces - 487B Strip(线段树+dp+二分)
题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在要求分成尽可能少的子段,且每个子段需要满足: 最大值与最小值的差值小于等于 s 子段长度大于等于 l 题目分析:dp[ i ] 代表的是前 ...
- 牛客 - 骚区间(线段树+思维)
题目链接:点击查看 题目大意:给出一个 1 ~ n 的排列 a ,现在规定骚区间当且仅当 a[ l ] 是 [ l , r ] 这段区间内的次小值,同时 a[ r ] 是 [ l , r ] 这段区间 ...
最新文章
- authy不同账户间不同步_「第七期」shopify产品还能同步到微信小程序销售?看这里...
- 线段树 ---- 牛客多校4 ETree Xor 区间异或分段
- Nocalhost: 云原生开发新体验
- re搜索字符串与find字符串不一样的结果
- 这是一份编程宝典,请查收!
- 1-3docker commit定制镜像
- transform与rigibody以及角色控制器的运动
- pip install 出现报asciii码错误的解决
- c语言指针知识点小结,C语言指针知识点总结
- 机器视觉在工业互联网中的应用
- 苹果Magic Trackpad2成功被谷歌团队写进去个Linux
- ArcMap 小知识(16):栅格计算器 raster calculator
- 2018.10.16 best-ks分箱
- ios Objective-c 字体样式大全(UIFont 可设置的)
- 魅族android10内测答案,魅族Flyme9内测答案
- Fumark支持SLI双卡测试设置
- leetcode_Hamming Distance
- 谈谈软件开发项目管理的积分制
- 安装32位Pycharm出现的系列问题if you already have a 32-bit JDK installed详细解决方法
- Ublox F9P通过NTRIP实现实时RTK定位
热门文章
- Python 代码绘制航海王四皇大妈(BIG MOM) - 门卫大爷也能跟着学会的Turtle海龟绘图系列
- Navicat 数据库连接工具连接oracle数据库提示cannot create oci handles问题解决方法
- Mac 技术篇-Oracle数据库连接工具SQL Developer启用、关闭自动提交事务,设置自动commit
- Windows 技巧篇-设置我的漂亮桌面
- CTFshow 命令执行 web118
- Python基础03 序列
- oracle中ci是什么意思,enq: CI - contention(附AWR)
- vue双向数据绑定原理分析--Mr.Ember
- CF293B Distinct Paths题解
- Laravel 多域名共享session