CF风格题,先猜结论,记数列中i这个数共出现了cnt[i]次,那么所有区间[i-cnt[i]+1,i]的并集的补集大小就是答案。

于是我们只需要线段树维护每个位置是否被某个区间覆盖到即可,对于整体加减操作,设一个偏移量即可。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define ls (x<<1)
  4. #define rs (ls|1)
  5. #define lson ls,L,mid
  6. #define rson rs,mid+1,R
  7. #define rep(i,l,r) for (int i=(l); i<=(r); i++)
  8. using namespace std;
  9.  
  10. const int N=;
  11. int n,m,mx,py,L,p,x,a[N],num[N],v[N<<],c[N<<],mn[N<<],tag[N<<];
  12.  
  13. void upd(int x){
  14. if (mn[ls]<mn[rs]) mn[x]=mn[ls],c[x]=c[ls];
  15. else if (mn[ls]>mn[rs]) mn[x]=mn[rs],c[x]=c[rs];
  16. else mn[x]=mn[ls],c[x]=c[ls]+c[rs];
  17. if (!mn[x]) v[x]=c[x]; else v[x]=;
  18. }
  19.  
  20. void put(int x,int k){
  21. mn[x]+=k; tag[x]+=k;
  22. if (!mn[x]) v[x]=c[x]; else v[x]=;
  23. }
  24.  
  25. void push(int x){
  26. if (!tag[x]) return;
  27. put(ls,tag[x]); put(rs,tag[x]); tag[x]=;
  28. }
  29.  
  30. void build(int x,int L,int R){
  31. if (L==R){ c[x]=v[x]=; return; }
  32. int mid=(L+R)>>;
  33. build(lson); build(rson); upd(x);
  34. }
  35.  
  36. void mdf(int x,int L,int R,int l,int r,int k){
  37. if (L==l && r==R){ put(x,k); return; }
  38. int mid=(L+R)>>; push(x);
  39. if (r<=mid) mdf(lson,l,r,k);
  40. else if (l>mid) mdf(rson,l,r,k);
  41. else mdf(lson,l,mid,k),mdf(rson,mid+,r,k);
  42. upd(x);
  43. }
  44.  
  45. int que(int x,int L,int R,int l,int r){
  46. if (L==l && r==R) return v[x];
  47. int mid=(L+R)>>; push(x);
  48. if (r<=mid) return que(lson,l,r);
  49. else if (l>mid) return que(rson,l,r);
  50. else return que(lson,l,mid)+que(rson,mid+,r);
  51. }
  52.  
  53. void Mdf(int x,int w){
  54. int k=num[py+x]+(w>); num[py+x]+=w;
  55. if (x<=n) mdf(,,mx,py+x-k+,py+x-k+,w);
  56. }
  57.  
  58. int main(){
  59. freopen("number.in","r",stdin);
  60. freopen("number.out","w",stdout);
  61. scanf("%d%d",&n,&m); mx=(n+m)*+; py=n+m; build(,,mx);
  62. rep(i,,n) scanf("%d",&a[i]),Mdf(a[i],);
  63. while (m--){
  64. scanf("%d%d",&p,&x);
  65. if (p>) Mdf(a[p]+L,-),a[p]=x-L,Mdf(a[p]+L,);
  66. else if (x>){
  67. py--; L++; int pos=py+n+;
  68. if (num[pos]>) mdf(,,mx,pos-num[pos]+,pos,-);
  69. }else{
  70. int pos=py+n+; py++; L--;
  71. if (num[pos]>) mdf(,,mx,pos-num[pos]+,pos,);
  72. }
  73. printf("%d\n",que(,,mx,py+,py+n));
  74. }
  75. return ;
  76. }

[Luogu5324][BJOI2019]删数(线段树)的更多相关文章

  1. Luogu5324 BJOI2019删数(线段树)

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

  2. 【BJOI2019】删数 线段树

    题目大意:一个数列若能在有限次数内删空,则称这个数列可以删空,一次删除操作定义如下: 记当前数列长度为$k$,则删掉数列中所有等于$k$的数. 现在有一个长度为$n$的数列$a$,有$m$次修改操作, ...

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

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

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

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

  5. luogu P5324 [BJOI2019]删数

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

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

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

  7. Problem 1007 幸运数 线段树成段更新

    题目链接: 题目 Problem 1007 幸运数 Time Limit: 2000 mSec Memory Limit : 131072 KB 问题描述 皮特的幸运数是2和5.只由幸运数字2和5组成 ...

  8. [BJOI2019] 删数

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

  9. hdu 4417 区间内比h小的数 线段树

    题意求区间内比h小的数的个数 将所有的询问离线读入之后,按H从小到大排序.然后对于所有的结点也按从小到大排序,然后根据查询的H,将比H小的点加入到线段树,然后就是一个区间和. 2015-07-27:专 ...

随机推荐

  1. DNS 预读取功能 链接预取

    https://developer.mozilla.org/zh-CN/docs/Controlling_DNS_prefetching DNS 请求需要的带宽非常小,但是延迟却有点高,这一点在手机网 ...

  2. Comparison and difference for Default geodatabase,Current workspace,Scratch workspace,Home Folder

    Comparison and difference for Default geodatabase,Current workspace,Scratch workspace,Home Folder 商务 ...

  3. Java基础 hello world基础实例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  4. 23andme的申请流程和注意事项

    1. 申请时间 23andme的申请截止日期为每年的6月和12月:最近的一次截止日期是2019年6月12号: 23andme的委员会会在申请截止日期后的三个月后告知申请是否通过,即9月和次年3月就能得 ...

  5. Spring Boot 使用YAML配置

    YAML是JSON的一个超集,可以非常方便地将外部配置以层次结构形式存储起来.当项目的类路径中有SnakeYAML库(spring-boot-starter中已经被包含)时,SpringApplica ...

  6. js文档系统-jsdoc-docdash

    一.参考文档 模版:https://github.com/clenemt/docdash 例子:http://clenemt.github.io/docdash/index.html jsdoc:ht ...

  7. 使用mousedown、mousemove、mouseup实现拖拽效果

    如何实现一个元素的拖拽效果,使用原生的js实现,习惯了jquery的同学们,你们自己写了吗?N久使用mvvm框架,不写jquery的东西,感觉自己完全不会了. 话不多说,直接上code.本例子以简单的 ...

  8. APP排查内存泄漏最简单和直观的方法

        内存泄漏无疑会严重影响用户体验,一些本应该废弃的资源和对象无法被释放,导致手机内存的浪费,app使用的卡顿,那么如何排查内存泄漏呢? 当然,首先我们有google的官方文档可以参考,大部分博客 ...

  9. CentOS7为docker-ce配置阿里云镜像加速器

    一.找加速地址 https://promotion.aliyun.com/ntms/act/kubernetes.html 控制台 二.添加daemon.json 文件 vim /etc/docker ...

  10. Docker从容器内拷贝文件到主机上

    //以elasticsearch容器为例 //运行es docker run -d -p 9200:9200 elasticsearch:5.4 //查看已运行的容器 docker ps //进去容器 ...