传送门

不如先考虑暴力,能删的序列首先有\(1,2,3...n\),还有就是升序排序后从后往前放数,第\(i\)位要么放\(i\),要么放\(i+1\)位置的数,例如\(1,2,4,4,5,6,9,9,9\)

如果一个数\(i\)出现了若干次,假如是\(num_i\)次,我们发现是可以在\(i,i-1,i-2...i-num_i+1\)上放\(i\)的,这样放完之后,如果有的位置没有用到现有的数放上去,那么就要从没用的数里改一个放过来,问题也就是用一堆数,最多能放多少个位置.考虑从后往前放,然后如果一个位置有多个数就接着用这种数往后放.如果放到一个位置\(j\),\(j\)有若干个,当前的\(i\)也有若干个,我们只能用一种放,那么显然要用更多的那种放.最后没放数的位置数就是答案.

为了方便,我们把放数看成区间覆盖,即一个\(i\)可以覆盖\([i-num_i+1,i]\)这段区间,我们再给所有覆盖区间加上\(1\),那就是求\([1,n]\)中\(0\)的个数.注意到修改的\(+1/-1\)都是整体的,所以如果把所有数放在一根数轴上,那么初始要统计的区间为\([1,n]\),然后整体\(+1\)相当于统计区间整体向左移\(1\),然后 以原统计区间右端点 为右端点 的对应区间覆盖的贡献要减掉,因为那个右端点的数超过统计范围,不能放进来;整体\(-1\)相当于统计区间整体向右移\(1\),然后 以原统计区间右端点 为右端点 的对应区间覆盖的贡献要加上;单点修改,也就是原来的\(num_{a_p}\)减\(1\),后面的新的\(num\)加\(1\),这导致对应两个覆盖区间左端点右移和左移.这些东西可以用线段树维护,注意线段树的叶子数量应该是\(n+q+q\)

至于区间\(0\)的数量,用值域线段树维护因为区间\(+1\),某个位置最少为\(0\),只要维护区间最小值及数量就行了

  1. // luogu-judger-enable-o2
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cstdio>
  7. #include<vector>
  8. #include<cmath>
  9. #include<ctime>
  10. #include<queue>
  11. #include<map>
  12. #include<set>
  13. #define LL long long
  14. #define db double
  15. using namespace std;
  16. const int N=150000+10,M=N*3;
  17. int rd()
  18. {
  19. int x=0,w=1;char ch=0;
  20. while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
  21. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  22. return x*w;
  23. }
  24. struct node
  25. {
  26. int mi,nm;
  27. node(){mi=0,nm=1;}
  28. node(int nmi,int nnm){mi=nmi,nm=nnm;}
  29. node operator + (const node &bb) const
  30. {
  31. if(mi==bb.mi) return node(mi,nm+bb.nm);
  32. return mi<bb.mi?(*this):bb;
  33. }
  34. void ad(int x){mi+=x;}
  35. }s[M<<2],nw;
  36. int tg[M<<2];
  37. void psup(int o){s[o]=s[o<<1]+s[o<<1|1];}
  38. void psdn(int o){if(tg[o]) s[o<<1].ad(tg[o]),tg[o<<1]+=tg[o],s[o<<1|1].ad(tg[o]),tg[o<<1|1]+=tg[o],tg[o]=0;}
  39. #define mid ((l+r)>>1)
  40. int nl,nr;
  41. void modif(int o,int l,int r,int ll,int rr,int x)
  42. {
  43. if(ll<=l&&r<=rr){s[o].ad(x),tg[o]+=x;return;}
  44. psdn(o);
  45. if(ll<=mid) modif(o<<1,l,mid,ll,rr,x);
  46. if(rr>mid) modif(o<<1|1,mid+1,r,ll,rr,x);
  47. psup(o);
  48. }
  49. void modif(int lx,int x)
  50. {
  51. int o=1,l=nl,r=nr,st[21],tp=0;
  52. while(l<r)
  53. {
  54. st[++tp]=o,psdn(o);
  55. if(lx<=mid) o=o<<1,r=mid;
  56. else o=o<<1|1,l=mid+1;
  57. }
  58. s[o].ad(x);
  59. while(tp)
  60. {
  61. o=st[tp--];
  62. psup(o);
  63. }
  64. }
  65. node quer(int o,int l,int r,int ll,int rr)
  66. {
  67. if(ll<=l&&r<=rr) return s[o];
  68. psdn(o);
  69. node an;
  70. an.mi=M;
  71. if(ll<=mid) an=an+quer(o<<1,l,mid,ll,rr);
  72. if(rr>mid) an=an+quer(o<<1|1,mid+1,r,ll,rr);
  73. psup(o);
  74. return an;
  75. }
  76. void bui(int o,int l,int r)
  77. {
  78. if(l==r) return;
  79. bui(o<<1,l,mid),bui(o<<1|1,mid+1,r);
  80. psup(o);
  81. }
  82. int n,q,a[N],nm[M],ll=150001,rr;
  83. int main()
  84. {
  85. n=rd(),q=rd();
  86. rr=ll+n-1;
  87. nl=ll-q,nr=rr+q;
  88. bui(1,nl,nr);
  89. for(int i=1;i<=n;++i)
  90. {
  91. a[i]=rd()+ll-1;
  92. ++nm[a[i]];
  93. modif(a[i]-nm[a[i]]+1,1);
  94. }
  95. while(q--)
  96. {
  97. int p=rd();
  98. if(!p)
  99. {
  100. if(~rd())
  101. {
  102. if(nm[rr]) modif(1,nl,nr,rr-nm[rr]+1,rr,-1);
  103. --ll,--rr;
  104. }
  105. else
  106. {
  107. ++ll,++rr;
  108. if(nm[rr]) modif(1,nl,nr,rr-nm[rr]+1,rr,1);
  109. }
  110. }
  111. else
  112. {
  113. if(a[p]<=rr) modif(a[p]-nm[a[p]]+1,-1);
  114. --nm[a[p]];
  115. a[p]=rd()+ll-1;
  116. ++nm[a[p]];
  117. modif(a[p]-nm[a[p]]+1,1);
  118. }
  119. nw=quer(1,nl,nr,ll,rr);
  120. printf("%d\n",nw.mi?0:nw.nm);
  121. }
  122. return 0;
  123. }

luogu P5324 [BJOI2019]删数的更多相关文章

  1. 【题解】Luogu P5324 [BJOI2019]删数

    原题传送门 易知这个数列的顺序是不用考虑的 我们看两个数列 \(1,2,3\)和\(3,3,3\)都能删完,再看两个数列\(1,2,3,4\)和\(2,2,4,4\),也都能删完 不难发现,我们珂以把 ...

  2. [BJOI2019]删数(线段树)

    [BJOI2019]删数(线段树) 题面 洛谷 题解 按照值域我们把每个数的出现次数画成一根根的柱子,然后把柱子向左推导,\([1,n]\)中未被覆盖的区间长度就是答案. 于是问题变成了单点修改值,即 ...

  3. 题解 洛谷 P5324 【[BJOI2019]删数】

    先考虑对于一个序列,能使其可以删空的的修改次数. 首先可以发现,序列的排列顺序是没有影响的,所以可以将所有数放到桶里来处理. 尝试对一个没有经过修改的可以删空的序列来进行删数,一开始删去所有的\(n\ ...

  4. [BJOI2019] 删数

    https://www.luogu.org/problemnew/show/P5324 题解 首先我们需要弄清这个答案是什么. 对于一个长度为n的序列,那么它先删的肯定是\(n\),删完之后它就会跳到 ...

  5. [BJOI2019] 删数 [dp转贪心结论+线段树]

    题面 传送门 思路 dp部分 以下称合法序列为原题面中可以删空的序列 这个是我在模拟考场上的思路 一开始我是觉得,这个首先可以写成一个dp的形式:$dp[i][j]$表示用$j$个数字填满了目标序列的 ...

  6. Luogu P2426 【删数】

    状态定义: 一眼区间$DP$,从左右两边删不好定义状态,不如定义$dp[i][j]$表示$[i,j]$未删的最大值,转移就很自然了 转移: 从左边删$dp[i][j]=max(dp[i][j],dp[ ...

  7. Luogu5324 BJOI2019删数(线段树)

    考虑无修改怎么做.对于1~n的每个数,若其存在,将最后一个放在其值的位置,剩余在其前面依次排列,答案即为值域1~n上没有数的位置个数.带修改显然记一下偏移量线段树改一改就好了. #include< ...

  8. [Luogu5324][BJOI2019]删数(线段树)

    CF风格题,先猜结论,记数列中i这个数共出现了cnt[i]次,那么所有区间[i-cnt[i]+1,i]的并集的补集大小就是答案. 于是我们只需要线段树维护每个位置是否被某个区间覆盖到即可,对于整体加减 ...

  9. 【LOJ】#3094. 「BJOI2019」删数

    LOJ#3094. 「BJOI2019」删数 之前做atcoder做到过这个结论结果我忘了... em,就是\([1,n]\)之间每个数\(i\),然后\([i - cnt[i] + 1,i]\)可以 ...

随机推荐

  1. MongoDB索引基本操作

    一.简介 在MongoDB建立索引能提高查询效率,只需要扫描索引只存储的这个集合的一小部分,并只把这小部分加载到内存中,效率大大的提高,如果没有建立索引,在查询时,MongoDB必须执行全表扫描,在数 ...

  2. Vue (二) --- Vue对象提供的属性功能

    --------------------------------------------不是井里没有水,而是你挖的不够深. 3. Vue对象提供的属性功能 3.1 过滤器 过滤器,就是vue允许开发者 ...

  3. Django的Models字段含义

    在model中添加字段的格式一般为:  field_name = field_type(**field_options) 一  field options(所有字段共用) 1  null   默认为F ...

  4. MVC和MVVM

    MVC和MVVM的qu'bie 1. Mvvm定义MVVM是Model-View-ViewModel的简写.即模型-视图-视图模型.[模型]指的是后端传递的数据.[视图]指的是所看到的页面.[视图模型 ...

  5. PHP7.0-PHP7.3新特性与变更

    到目前为止,PHP7发布已经升级到7.3,本文来总结一下每个版本的变更与新特性 PHP7.0 1. 组合比较符 (<=>) 组合比较符号用于比较两个表达式.当$a小于.等于或大于$b时它分 ...

  6. 二 Array 数组常用操作方法

    数组链接 Array 构造上的方法 一.Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable) ...

  7. mysql-笔记-numberic 方法 操作符

    DIV 整数除法---结果舍去小数部分, /除法 ---除以0时返回 null值 -减法 % MOD 取模 ---结果为 余数 也可以用于有小数部分的数返回余数,mod(N,0)返回null值 + 加 ...

  8. python之路8-内置模块介绍

    time & datetime模块 1 #_*_coding:utf-8_*_ 2 __author__ = 'Alex Li' 3 4 import time 5 6 7 # print(t ...

  9. 苹果“抄袭”雷军PPT?小米高管如此评论

    3月26日凌晨,苹果如期举行了春季发布会,但发布会上并没有发布任何新硬件,主角全部是电视.游戏.信用卡等软件新品,值得一提的是,在苹果PPT上,有一张将硬件/软件/服务三部分单独提炼出来. “抄袭”雷 ...

  10. jmetter的http请求设置

    1.设置 cookie 2.设置header 3.login 4.post请求 5.get请求