题目链接

题意

给定一个长度为\(n\)的数组\(a\),\(q\)个操作,操作分两种:

  1. 对于区间\([l,r]\),询问\(Mex\{c_0,c_1,c_2,⋯,c_{10^9}\}\),其中\(c_i\)表示\(i\)在\([l,r]\)中的出现次数;
  2. 将\(a_p\)修改为\(x\).

思路

参考:http://www.cnblogs.com/PinkRabbit/p/8476664.html

\(cnt\)数组记录\(a\)数组中数字的出现次数,\(num\)数组记录\(cnt\)数组中数字的出现次数,因此\(num\)数组中第一个对应值为\(0\)的下标即为\(Mex\).

:同样的想法也可以用于维护众数的出现次数,\(num\)数组中最大的对应值不为\(0\)的下标即为众数的出现次数。

那么答案如何统计呢?

若答案为\(k\)则数字总数至少为\(1+2+\cdots+k-1=\frac{k*(k-1)}{2}\),所以每次从头开始统计答案是\(O(\sqrt n)\)的复杂度;

另外一个注意点就是\(num[0]\)的大小,也即初始为\(0\)的数字的个数,要开到离散化后的数字总数+1那么大,这是因为\(num[0]\)始终应该有值,因为要对\([0,10^9]\)的所有数统计(感谢粉兔)

Code

  1. #include <bits/stdc++.h>
  2. #define F(i, a, b) for (int i = (a); i < (b); ++i)
  3. #define F2(i, a, b) for (int i = (a); i <= (b); ++i)
  4. #define dF(i, a, b) for (int i = (a); i > (b); --i)
  5. #define dF2(i, a, b) for (int i = (a); i >= (b); --i)
  6. #define maxn 100010
  7. using namespace std;
  8. typedef long long LL;
  9. int n,m,blo,temp,nn,a[maxn],t[maxn], bl[maxn], cnt[maxn<<1], num[maxn<<1], l, r, mp[maxn<<1], tot, ans[maxn],
  10. cnt1, cnt2, tim;
  11. struct qnode {
  12. int l,r,tim,id;
  13. bool operator < (const qnode& nd) const {
  14. return bl[l]==bl[nd.l] ? (bl[r]==bl[nd.r] ? tim<nd.tim : bl[r]<bl[nd.r]) : bl[l]<bl[nd.l];
  15. }
  16. }q[maxn];
  17. struct cnode { int x, yt, ys; }c[maxn];
  18. inline void add(int x) { --num[cnt[x]]; ++num[++cnt[x]]; }
  19. inline void del(int x) { --num[cnt[x]]; ++num[--cnt[x]]; }
  20. inline void cha(int x, int y) {
  21. if (l<=x&&x<=r) del(a[x]), add(y);
  22. a[x] = y;
  23. }
  24. void discrete() {
  25. sort(mp, mp+tot);
  26. nn=unique(mp, mp+tot)-mp;
  27. F2(i, 1, n) a[i]=lower_bound(mp,mp+nn,a[i])-mp+1;
  28. F2(i, 1, cnt2) c[i].ys=lower_bound(mp,mp+nn,c[i].ys)-mp+1, c[i].yt=lower_bound(mp,mp+nn,c[i].yt)-mp+1;
  29. }
  30. int main() {
  31. scanf("%d%d", &n, &m); blo = pow(n, 2.0/3.0);
  32. F2(i, 1, n) scanf("%d", &a[i]), t[i] = mp[tot++] = a[i], bl[i]=(i-1)/blo;
  33. F(i, 0, m) {
  34. int op,l,r;
  35. scanf("%d%d%d",&op,&l,&r);
  36. if (op==1) q[cnt1] = {l, r, tim, cnt1}, ++cnt1;
  37. else ++tim, c[++cnt2] = {l, r, t[l]}, t[l] = r, mp[tot++] = r;
  38. }
  39. discrete();
  40. sort(q, q+cnt1);
  41. r=0, l=1;
  42. num[0]=nn+1; tim=0;
  43. F(i, 0, cnt1) {
  44. while (tim<q[i].tim) tim++, cha(c[tim].x, c[tim].yt);
  45. while (tim>q[i].tim) cha(c[tim].x, c[tim].ys), --tim;
  46. while (r<q[i].r) add(a[++r]);
  47. while (l>q[i].l) add(a[--l]);
  48. while (r>q[i].r) del(a[r--]);
  49. while (l<q[i].l) del(a[l++]);
  50. int temp=0;
  51. while (num[temp]) ++temp;
  52. ans[q[i].id] = temp;
  53. }
  54. F(i, 0, cnt1) printf("%d\n", ans[i]);
  55. return 0;
  56. }

Codeforces 940F Machine Learning 带修改莫队的更多相关文章

  1. CF940F Machine Learning 带修改莫队

    题意:支持两种操作:$1.$ 查询 $[l,r]$ 每个数字出现次数的 $mex$,$2.$ 单点修改某一位置的值. 这里复习一下带修改莫队. 普通的莫队中,以左端点所在块编号为第一关键字,右端点大小 ...

  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. CentOS 7 安装Nginx并实现域名转发

    CentOS 7 条件 教程中的步骤需要root用户权限. 一.添加Nginx到YUM源 添加CentOS 7 Nginx yum资源库,打开终端,使用以下命令: sudo rpm -Uvh http ...

  2. 【紫书】(UVa1347)Tour

    继续考虑dp题目. 题意分析 其实这里只是更加仔细的做一个lrj的复读机(Orz 他分析了一个很重要的结果:如果是一个人从左到右再回来,并且每个点恰经过一次,那么等价于两个人从左到右每个点经过一次地遍 ...

  3. Tomcat突然用开发工具启动不起来,只报了个红色的警告,没有其他任何异常

    碰到这个问题是,是因为我的catalina.bat文件做了配置修改,导致与工具这边的启动设置起了冲突 下面这个是我在Catalina.bat中新增的配置,删掉这个就可以了 set JAVA_OPTS= ...

  4. ssh问题_1

    昨天配置了虚拟机的ssh,可以相互连接,但是今天早上就不行了,遇到如下错误 [slave1@hadoop ~]$ scp .ssh/id_rsa.pub master@hadoop.master:~/ ...

  5. 《学习OpenCV》课后习题解答8

    题目:(P126) 本章完整讲述了基本的输入/输出编程以及OpenCV的数据结构.下面的练习是基于前面的知识做一些应用,为后面大程序的实现提供帮助. a.创建一个程序实现以下功能:(1)从视频文件中读 ...

  6. redis-20180118

    1.redis hash  100% 2.redis list 100% 3.redis sentinel 20%

  7. JS实现双击编辑可修改

    需求描述:在一段文字处双击可以进行修改,也就是双击后创建输入框,输入内容,在输入框失去焦点后将输入的内容再以文字的形式显示出来,以下是html代码: 1 <fieldset> 2 < ...

  8. 【历史】- Unix英雄传:图文细数十五位计算机先驱

    Unix,一款多任务多用户操作系统,最早由AT&T公司员工及合作伙伴在贝尔实验室于1969年开发完成.Unix的衍生及克隆版本包括Berkeley Unix.Minix.Linux.AIX.A ...

  9. html框架集 target

  10. 【题解】AHOI2009中国象棋

    还记得第一次看见这题的时候好像还是联赛前后的事了,那时感觉这题好强……其实现在看来蛮简单的,分类讨论一下即可.题意非常的简单:每一行,每一列都不能超过两个棋子.考虑我们的dp,如果一行一行转移的话行上 ...