题目链接:Array and Segments (Hard version)

题意:给定一个长度为n的序列,m个区间,从m个区间内选择一些区间内的数都减一,使得整个序列的最大值减最小值最大。

题解:利用差分的思想,并且考虑到m比较小,遍历一遍序列,当前点遇到需要改变的时候进行操作,同时更新答案。

  1. #include <set>
  2. #include <map>
  3. #include <queue>
  4. #include <deque>
  5. #include <stack>
  6. #include <cmath>
  7. #include <cstdio>
  8. #include <vector>
  9. #include <string>
  10. #include <cstring>
  11. #include <fstream>
  12. #include <iostream>
  13. #include <algorithm>
  14. using namespace std;
  15.  
  16. #define eps 1e-8
  17. #define pb push_back
  18. #define PI acos(-1.0)
  19. #define INF 0x3f3f3f3f
  20. #define clr(a,b) memset(a,b,sizeof(a)
  21. #define bugc(_) cerr << (#_) << " = " << (_) << endl
  22. #define FAST_IO ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
  23.  
  24. const int N=1e5+;
  25. typedef long long ll;
  26. typedef unsigned long long ull;
  27. int a[N],l[N],r[N];
  28. vector <int> sub[N],add[N];
  29.  
  30. int main(){
  31. int mxt=-INF,mit=INF;
  32. int n,m,ans=-INF,ansid=,cnt=;
  33. scanf("%d%d",&n,&m);
  34. for(int i=;i<=n;i++){
  35. scanf("%d",&a[i]);
  36. mit=min(mit,a[i]);mxt=max(mxt,a[i]);
  37. }
  38. ans=mxt-mit;
  39. for(int i=;i<=m;i++){
  40. scanf("%d%d",&l[i],&r[i]);
  41. sub[l[i]].push_back(i);
  42. add[r[i]+].push_back(i);
  43. }
  44. for(int i=;i<=n;i++){
  45. for(int j=;j<sub[i].size();j++){
  46. int id=sub[i][j];
  47. for(int k=l[id];k<=r[id];k++) a[k]--;
  48. }
  49. for(int j=;j<add[i].size();j++){
  50. int id=add[i][j];
  51. for(int k=l[id];k<=r[id];k++) a[k]++;
  52. }
  53. if(sub[i].size()||add[i].size()){
  54. int mi=INF,mx=-INF;
  55. for(int j=;j<=n;j++) mi=min(mi,a[j]),mx=max(mx,a[j]);
  56. if(ans<mx-mi){
  57. ans=mx-mi;
  58. ansid=i;
  59. }
  60. }
  61. }
  62. printf("%d\n",ans);
  63. for(int i=;i<=m;i++){
  64. if(l[i]<=ansid&&r[i]>=ansid) cnt++;
  65. }
  66. printf("%d\n",cnt);
  67. for(int i=;i<=m;i++){
  68. if(l[i]<=ansid&&r[i]>=ansid) printf("%d ",i);
  69. }
  70. return ;
  71. }

Codeforces 1108E2 Array and Segments (Hard version)(差分+思维)的更多相关文章

  1. Codeforces 1108E2 Array and Segments (Hard version) 差分, 暴力

    Codeforces 1108E2 E2. Array and Segments (Hard version) Description: The only difference between eas ...

  2. codeforces#1108E2. Array and Segments (线段树+扫描线)

    题目链接: http://codeforces.com/contest/1108/problem/E2 题意: 给出$n$个数和$m$个操作 每个操作是下标为$l$到$r$的数减一 选出某些操作,使$ ...

  3. Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】

    传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...

  4. Array and Segments (Easy version) CodeForces - 1108E1 (暴力枚举)

    The only difference between easy and hard versions is a number of elements in the array. You are giv ...

  5. 【Codeforces 1108E1】Array and Segments (Easy version)

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 枚举最大值和最小值在什么地方. 显然,只要包含最小值的区间,都让他减少. 因为就算那个区间包含最大值,也无所谓,因为不会让答案变小. 但是那些 ...

  6. E1. Array and Segments (Easy version)(暴力) && E2. Array and Segments (Hard version)(线段树维护)

    题目链接: E1:http://codeforces.com/contest/1108/problem/E1 E2:http://codeforces.com/contest/1108/problem ...

  7. CF E2 - Array and Segments (Hard version) (线段树)

    题意给定一个长度为n的序列,和m个区间.对一个区间的操作是:对整个区间的数-1可以选择任意个区间(可以为0个.每个区间最多被选择一次)进行操作后,要求最大化的序列极差(极差即最大值 - 最小值).ea ...

  8. Codeforces 1108E (Array and Segments) 线段树

    题意:给你一个长度为n的序列和m组区间操作,每组区间操作可以把区间[l, r]中的数字都-1,请选择一些操作(可以都不选),使得序列的最大值和最小值的差值尽量的大. 思路:容易发现如果最大值和最小值都 ...

  9. CF1108E2 Array and Segments (Hard version)

    线段树 对于$Easy$ $version$可以枚举极大值和极小值的位置,然后判断即可 但对于$Hard$ $version$明显暴力同时枚举极大值和极小值会超时 那么,考虑只枚举极小值 对于数轴上每 ...

随机推荐

  1. 浅谈C#中的for循环与foreach循环

    for循环和foreach循环其实可以算得上是从属关系的,即foreach循环是可以转化成for循环,但是for循环不一定能转换成foreach循环. 下面简单介绍一下两种循环: 1.for循环 代码 ...

  2. Windows环境下使用pip install安装lxml库

    lxml是Python语言和XML以及HTML工作的功能最丰富和最容易使用的库.lxml是为libxml2和libxslt库的一个Python化的绑定.它与众不同的地方是它兼顾了这些库的速度和功能完整 ...

  3. Spring注解AOP及单元测试junit(6)

    2019-03-10/20:19:56 演示:将xml配置方式改为注解方式 静态以及动态代理推荐博客:https://blog.csdn.net/javazejian/article/details/ ...

  4. U813.0操作员功能权限和数据权限的设置

    操作员的权限有功能权限.数据权限.金额权限. 1. 给操作员设置功能权限,操作员才能进入系统进行相关业务操作. Admin用户登录无法修改账套,但可以新建.引入.输出.Demo用户每次只能进入一个账套 ...

  5. Play vue.js with constant value in SailsJS

    SailsJS supplies a utility module called parasails, which defines two elements, <ajax-form> an ...

  6. djangorestframework+vue-cli+axios,为axios添加token作为headers踩坑记

    情况是这样的,项目用的restful规范,后端用的django+djangorestframework,前端用的vue-cli框架+webpack,前端与后端交互用的axios,然后再用户登录之后,a ...

  7. AI 学习路线

    [导读] 本文由知名开源平台,AI技术平台以及领域专家:Datawhale,ApacheCN,AI有道和黄海广博士联合整理贡献,内容涵盖AI入门基础知识.数据分析挖掘.机器学习.深度学习.强化学习.前 ...

  8. 隐写术之steghide的使用

    steghide不是一个软件,所以下载之后解压缩就可以在命令行中使用. win+R,cmd,回车->进入到steghide.exe所在的文件夹,使用隐藏或者解锁的相应命令,即可隐藏或者解锁. 这 ...

  9. 2013年山东省赛F题 Mountain Subsequences

    2013年山东省赛F题 Mountain Subsequences先说n^2做法,从第1个,(假设当前是第i个)到第i-1个位置上哪些比第i位的小,那也就意味着a[i]可以接在它后面,f1[i]表示从 ...

  10. 关于SSH的那些事

    SSH: Secure Shell Protocol  (安全外壳协议) Secure Shell,又可记为安全外壳协议(SSH) Secure Shell,又可记为安全外壳协议(SSH),最初是UN ...