传送们

题意:

给你一个长度为nnn的数列bbb、以及mmm个区间。
你可以选取111个或多个这样的区间aia_iai​,使得令区间aia_iai​所对应的所有值bib_ibi​都减111。你最终要使得max⁡i=1nbi−min⁡i=1nbi\max\limits_{i=1}^{n}b_i - \min\limits_{i=1}^{n}b_ii=1maxn​bi​−i=1minn​bi​
最大。
问你方案数以及最大值。

题目分析:

在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(线段树+思维)相关推荐

  1. CodeForces - 1326E Bombs(线段树+思维)

    题目链接:点击查看 题目大意:给出一个 n 的排列记为 p[ i ] ,现在有一个初始时为空的集合A,对于每个 i 遍历 1 ~ n ,每次的操作如下: 向集合中添加 p[ i ] 如果位置 i 有炸 ...

  2. Codeforces 786B Legacy (线段树优化建图)

    Codeforces 786B Legacy (线段树优化建图) 题意:\(n\)个点,有\(3\)种连边操作:1.将\(u\)指向\(v\):2.将\(v\)指向编号在区间\([l,r]\)的点:3 ...

  3. 线段树——思维(Codeforces 339D Xenia and Bit Operations/Billboard HDU - 2795)

    Codeforces 339D Xenia and Bit Operations vj地址 题意:给出2的n次方个数,每次将现在这个序列中相邻的两个数运算后合并为一个数,得到一个新的序列,这个新序列的 ...

  4. CodeForces - 1405E Fixed Point Removal(线段树+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,规定当 a[ i ] == i 时,位置 i 可以被删除掉,后面位置会合并上来,现在需要回答 m 次询问,每次询问会问禁用掉后面 x 个 ...

  5. Sereja and Brackets CodeForces - 380C (线段树+分治思路)

    Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...

  6. 小翔和泰拉瑞亚(线段树+思维)

    链接:https://ac.nowcoder.com/acm/contest/3566/D 来源:牛客网 小翔和泰拉瑞亚 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K ...

  7. CodeForces - 787D - Legacy(线段树优化建图+最短路)

    题目链接:点击查看 题目大意:给出 nnn 个点和 mmm 条边,现在需要求从 ststst 开始到所有点的最短路是多少,mmm 条边的给出方式如下: 1uvw1 \ u \ v \ w1 u v w ...

  8. CodeForces - 487B Strip(线段树+dp+二分)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在要求分成尽可能少的子段,且每个子段需要满足: 最大值与最小值的差值小于等于 s 子段长度大于等于 l 题目分析:dp[ i ] 代表的是前 ...

  9. 牛客 - 骚区间(线段树+思维)

    题目链接:点击查看 题目大意:给出一个 1 ~ n 的排列 a ,现在规定骚区间当且仅当 a[ l ] 是 [ l , r ] 这段区间内的次小值,同时 a[ r ] 是 [ l , r ] 这段区间 ...

最新文章

  1. authy不同账户间不同步_「第七期」shopify产品还能同步到微信小程序销售?看这里...
  2. 线段树 ---- 牛客多校4 ETree Xor 区间异或分段
  3. Nocalhost: 云原生开发新体验
  4. re搜索字符串与find字符串不一样的结果
  5. 这是一份编程宝典,请查收!
  6. 1-3docker commit定制镜像
  7. transform与rigibody以及角色控制器的运动
  8. pip install 出现报asciii码错误的解决
  9. c语言指针知识点小结,C语言指针知识点总结
  10. 机器视觉在工业互联网中的应用
  11. 苹果Magic Trackpad2成功被谷歌团队写进去个Linux
  12. ArcMap 小知识(16):栅格计算器 raster calculator
  13. 2018.10.16 best-ks分箱
  14. ios Objective-c 字体样式大全(UIFont 可设置的)
  15. 魅族android10内测答案,魅族Flyme9内测答案
  16. Fumark支持SLI双卡测试设置
  17. leetcode_Hamming Distance
  18. 谈谈软件开发项目管理的积分制
  19. 安装32位Pycharm出现的系列问题if you already have a 32-bit JDK installed详细解决方法
  20. Ublox F9P通过NTRIP实现实时RTK定位

热门文章

  1. Python 代码绘制航海王四皇大妈(BIG MOM) - 门卫大爷也能跟着学会的Turtle海龟绘图系列
  2. Navicat 数据库连接工具连接oracle数据库提示cannot create oci handles问题解决方法
  3. Mac 技术篇-Oracle数据库连接工具SQL Developer启用、关闭自动提交事务,设置自动commit
  4. Windows 技巧篇-设置我的漂亮桌面
  5. CTFshow 命令执行 web118
  6. Python基础03 序列
  7. oracle中ci是什么意思,enq: CI - contention(附AWR)
  8. vue双向数据绑定原理分析--Mr.Ember
  9. CF293B Distinct Paths题解
  10. Laravel 多域名共享session