题意:支持两种操作:$1.$ 查询 $[l,r]$ 每个数字出现次数的 $mex$,$2.$ 单点修改某一位置的值.

这里复习一下带修改莫队.

普通的莫队中,以左端点所在块编号为第一关键字,右端点大小为第二关键字,在带修改莫队中每一个操作都有一个时间戳,那时间戳就是第三关键字.

可以将数字先离散化,开一个桶来维护每一种数字出现的次数.

然后在移动区间时就将对应数字删除/插入.

再维护一个当前时刻,表示当前数组的状态是第 $now$ 个修改进行后的状态.

将 $now$ 一直移动到和当前询问的时间戳吻合即可.

注意:在移动时间戳的时候要换一下修改的值. 假如说原来的修改是变成 $y$,而序列中的元素为 $x$,就要将修改的元素变成 $y$.

这样在下一次经过这个时间戳的时候就会将之前改动过的值再改回来.

排序函数一定要注意:

  1. struct query
  2. {
  3. int l,r,id,t;
  4. query(int l=0,int r=0):l(l),r(r){}
  5. bool operator<(query b) const
  6. {
  7. return l/B==b.l/B?(r/B==b.r/B?t<b.t:r<b.r):l<b.l;
  8. }
  9. }q[N];

这里千万不能写错,否则整个时间复杂度就假了~

一般来说,带修改莫队中块的大小取在 $n^{0.6666}$ 来说是比较优的.

这道题中,你发现 $mex$ 的大小不超过 $\sqrt n$,所以我们可以直接暴力求.

code:

  1. #include <bits/stdc++.h>
  2. #define N 300005
  3. #define ll long long
  4. #define setIO(s) freopen(s".in","r",stdin)
  5. using namespace std;
  6. int n,m,tot,opcnt,qcnt,B,now;
  7. int a[N],A[N],output[N],cnt[N],mex[N];
  8. struct query
  9. {
  10. int l,r,id,t;
  11. query(int l=0,int r=0):l(l),r(r){}
  12. bool operator<(query b) const
  13. {
  14. return l/B==b.l/B?(r/B==b.r/B?t<b.t:r<b.r):l<b.l;
  15. }
  16. }q[N];
  17. struct change
  18. {
  19. int p,x;
  20. change(int p=0,int x=0):p(p),x(x){}
  21. }c[N];
  22. void add(int num)
  23. {
  24. --mex[cnt[num]];
  25. ++mex[++cnt[num]];
  26. }
  27. void del(int num)
  28. {
  29. --mex[cnt[num]];
  30. ++mex[--cnt[num]];
  31. }
  32. void update(int id,int t)
  33. {
  34. if(c[t].p>=q[id].l&&c[t].p<=q[id].r)
  35. {
  36. del(a[c[t].p]);
  37. add(c[t].x);
  38. }
  39. swap(c[t].x, a[c[t].p]);
  40. }
  41. int getans()
  42. {
  43. int i,j;
  44. for(i=1;mex[i]>0;++i);
  45. return i;
  46. }
  47. int main()
  48. {
  49. int i,j,l=2,r=1;
  50. // setIO("input");
  51. scanf("%d%d",&n,&m);
  52. B=pow(n,0.6666);
  53. for(i=1;i<=n;++i)
  54. {
  55. scanf("%d",&a[i]);
  56. A[++tot]=a[i];
  57. }
  58. for(i=1;i<=m;++i)
  59. {
  60. int op,a,b;
  61. scanf("%d%d%d",&op,&a,&b);
  62. if(op==1)
  63. {
  64. ++qcnt;
  65. q[qcnt]=query(a,b);
  66. q[qcnt].id=qcnt;
  67. q[qcnt].t=opcnt;
  68. }
  69. else
  70. {
  71. ++opcnt;
  72. c[opcnt]=change(a,b);
  73. A[++tot]=b;
  74. }
  75. }
  76. sort(A+1,A+1+tot);
  77. for(i=1;i<=n;++i) a[i]=lower_bound(A+1,A+1+tot,a[i])-A;
  78. for(i=1;i<=opcnt;++i) c[i].x=lower_bound(A+1,A+1+tot,c[i].x)-A;
  79. sort(q+1,q+1+qcnt);
  80. for(i=1;i<=qcnt;++i)
  81. {
  82. for(;l>q[i].l;) add(a[--l]);
  83. for(;r<q[i].r;) add(a[++r]);
  84. for(;l<q[i].l;) del(a[l++]);
  85. for(;r>q[i].r;) del(a[r--]);
  86. for(;now<q[i].t;) update(i, ++now);
  87. for(;now>q[i].t;) update(i, now--);
  88. output[q[i].id]=getans();
  89. }
  90. for(i=1;i<=qcnt;++i) printf("%d\n",output[i]);
  91. return 0;
  92. }

  

CF940F Machine Learning 带修改莫队的更多相关文章

  1. Codeforces 940F Machine Learning 带修改莫队

    题目链接 题意 给定一个长度为\(n\)的数组\(a\),\(q\)个操作,操作分两种: 对于区间\([l,r]\),询问\(Mex\{c_0,c_1,c_2,⋯,c_{10^9}\}\),其中\(c ...

  2. BZOJ2120 数颜色(带修改莫队)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  3. bzoj 2120 数颜色 带修改莫队

    带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...

  4. BZOJ2120&2453数颜色——线段树套平衡树(treap)+set/带修改莫队

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  5. BZOJ.2453.维护队列([模板]带修改莫队)

    题目链接 带修改莫队: 普通莫队的扩展,依旧从[l,r,t]怎么转移到[l+1,r,t],[l,r+1,t],[l,r,t+1]去考虑 对于当前所在的区间维护一个vis[l~r]=1,在修改值时根据是 ...

  6. [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)

    BZOJ3585,BZOJ2120,BZOJ3757三合一. 对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队. 这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度. 剩下 ...

  7. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  8. BZOJ2120数颜色(带修改莫队)

    莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...

  9. 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法

    [题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...

随机推荐

  1. WUSTOJ 1208: 计算整数四则运算表达式的结果(Java)

    1208: 计算整数四则运算表达式的结果 参考资料 数据结构(C语言版)严蔚敏 吴伟民 编著----表达式求值 题目   简单四则运算.更多内容点击标题. 保证表达式合法. 运算符只包含:加(+),减 ...

  2. xv6解析-- 多处理器操作

    xv6可以运行多cpu的计算机上,这个os使用mycpu函数来标识初当前的cpu,使用struct cpu结构体来记录当前的CPU状态.使用cpus这些状态存放于cpus数组中,使用ncpu来标志cp ...

  3. 『Python Web框架之Django』第几节: AJAX

    一. AJAX简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”.即使用Javascript语言与服务器进行异步交互, ...

  4. scratch少儿编程第一季——04、想要做到有的放矢,瞄准方向很重要

    各位小伙伴大家好: 上期我们学习了动作模块的前面三个指令,今天我们继续学习下面的5个指令. 首先来看第一个(控制方向): 面向90方向默认就是屏幕的右边. 点击白色文本框上面的▼可以打开下拉菜单. 大 ...

  5. Luogu5363 SDOI2019移动金币(博弈+动态规划)

    容易想到可以转化为一个有m堆石子,石子总数不超过n-m的阶梯博弈.阶梯博弈的结论是相当于只考虑奇数层石子的nim游戏. nim和不为0不好算,于是用总方案数减掉nim和为0的方案数.然后考虑dp,按位 ...

  6. (四)Activiti之流程定义部署之ZIP方式和流程定义查询

    一.流程定义部署之ZIP方式 上一章节我们使用classpath的方式加载流程定义文件,这里我们使用ZIP的方式. 1.1 用activiti插件生成bpmn和png图片之后,压缩到一个zip格式的压 ...

  7. SpringBoot mysql出现The server time zone value '�й���׼ʱ��' is unrecogni

    MySql :8.0.18 引入的mysql驱动: SpringBoot整合Mybatis的框架,在访问Controller的时候 : ava.sql.SQLException: The server ...

  8. springboot项目命linux环境下命令启动

    测试环境:dev nohup java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 \-Dcom.s ...

  9. phpstorm+xdebug+mvc

    前一段时间自己琢磨出来,今天又给忘了,还去t00ls发帖.... 写到这里备忘 拿这个yxcms举例子 版本: yxcms1.2.1 源码:http://pan.baidu.com/s/1pJM1CP ...

  10. JsonObject转换失败的bug

    使用过程发现初始化失败,终于找到原因 转换的字符串必须都是字符串,不能没有双引号,否则转换失败