题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2120

带修改的莫队;

用结构体存下修改和询问,排好序保证时间后就全局移动修改即可;

参考了TJ:https://blog.csdn.net/SmallSXJ/article/details/69676746

vis 标记得好精妙啊!这样修改都不用分别改加入和删除了!

还要注意区间的扩展和收缩在循环上有微妙不同,一定不要写错;

所以带修莫队也很简洁嘛!

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. int const maxn=1e4+;
  8. int n,m,a[maxn],b[maxn],pos[maxn],res,ans[maxn],base,cnt,tot,num[maxn*];
  9. bool vis[maxn];
  10. struct N{int bh,x,y;}ch[maxn];
  11. struct T{int pre,l,r,id;}q[maxn];
  12. bool cmp(T x,T y){return (pos[x.l]==pos[y.l])?x.r<y.r:pos[x.l]<pos[y.l];}
  13. void change(int p)
  14. {
  15. if(vis[p])
  16. {
  17. num[a[p]]--;
  18. if(num[a[p]]==)res--;
  19. }
  20. else
  21. {
  22. num[a[p]]++;
  23. if(num[a[p]]==)res++;
  24. }
  25. vis[p]^=;
  26. }
  27. void update(int p,int x)//a[p]=x
  28. {
  29. if(vis[p])
  30. {
  31. change(p);
  32. a[p]=x;
  33. change(p);
  34. }
  35. else a[p]=x;
  36. }
  37. void work()
  38. {
  39. int nw=,l=,r=;//
  40. for(int i=;i<=m;i++)
  41. {
  42. // while(nw<=q[i].pre)update(ch[nw].bh,ch[nw].y),nw++;
  43. // while(nw>q[i].pre)update(ch[nw].bh,ch[nw].x),nw--;
  44. // while(l<q[i].l)change(l),l++;
  45. // while(l>q[i].l)change(l),l--;
  46. // while(r<q[i].r)change(r),r++;
  47. // while(r>q[i].r)change(r),r--;
  48. // ans[q[i].id]=res;
  49. for(int j=nw+;j<=q[i].pre;j++)
  50. update(ch[j].bh,ch[j].y);
  51. for(int j=nw;j>q[i].pre;j--)
  52. update(ch[j].bh,ch[j].x);
  53. for(int j=r+;j<=q[i].r;j++) change(j);//注意扩展和收缩的不同!
  54. for(int j=r;j>q[i].r;j--) change(j);
  55. for(int j=l-;j>=q[i].l;j--) change(j);
  56. for(int j=l;j<q[i].l;j++) change(j);
  57. ans[q[i].id]=res;
  58. l=q[i].l,r=q[i].r,nw=q[i].pre;
  59. }
  60. }
  61. int main()
  62. {
  63. scanf("%d%d",&n,&m); base=sqrt(n);
  64. for(int i=;i<=n;i++)
  65. {
  66. pos[i]=(i-)/base+;
  67. scanf("%d",&a[i]); b[i]=a[i];
  68. }
  69. char cc[];
  70. for(int i=,x,y;i<=m;i++)
  71. {
  72. cin>>cc;
  73. scanf("%d%d",&x,&y);
  74. if(cc[]=='R')
  75. {
  76. ch[++tot].bh=x; ch[tot].x=b[x]; ch[tot].y=y;
  77. b[x]=y;
  78. }
  79. else q[++cnt].pre=tot,q[cnt].l=x,q[cnt].r=y,q[cnt].id=cnt;
  80. }
  81. sort(q+,q+m+,cmp);
  82. work();
  83. for(int i=;i<=cnt;i++)printf("%d\n",ans[i]);
  84. return ;
  85. }

bzoj2120 数颜色——带修莫队的更多相关文章

  1. bzoj2120: 数颜色 带修莫队

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

  2. BZOJ 2120 数颜色 (带修莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6367  Solved: 2537[Submit][Status][Discuss] ...

  3. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

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

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

  5. 【bzoj2120】数颜色 带修莫队

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

  6. [国家集训队][bzoj2120] 数颜色 [带修改莫队]

    题面: 传送门 思路: 这道题和SDOI2009的HH的项链很像,只是多了一个修改 模板套上去呀 莫队学习请戳这里:莫队 Code: #include<iostream> #include ...

  7. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

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

  8. NOI模拟 颜色 - 带修莫队/树套树

    题意: 一个颜色序列,\(a_1, a_2, ...a_i\)表示第i个的颜色,给出每种颜色的美丽度\(w_i\),定义一段颜色的美丽值为该段颜色的美丽值之和(重复的只计算一次),每次都会修改某个位置 ...

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

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

随机推荐

  1. JS——锚点的运用

    锚点的两种形式: 1.<a href="#a">点击到锚点</a> 2.window.location.hash = "#a"; 最后都 ...

  2. 如何用java生成随机验证码

     1.VerifyCode 类:   1 package com.HRuinger.enity;                          ImageIO.write(image, " ...

  3. Java_Web三大框架之Hibernate配置文件(二)

    下面介绍一下编写Hibernate的配置文件,使用Hibernate操作数据库. 开始部署:下载需要的jar包               下载Hibernate           Hibernat ...

  4. C#调用Win32 api时的内存操作

    一般情况下,C#与Win 32 Api的互操作都表现的很一致:值类型传递结构体,一维.二维指针传递IntPtr.在Win32 分配内存时,可以通过IntPtr以类似移动指针的方式读取内存.通过IntP ...

  5. day08-字符编码

    目录 计算机基础 启动应用程序 写文本的流程 Python解释器执行文件的原理 Python解释器与文本编辑器的区别 字符编码 字符编码发生在哪三个阶段 字符编码发展史与分类 总结 Python2与P ...

  6. SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    Sql 四大排名函数(ROW_NUMBER.RANK.DENSE_RANK.NTILE)简介   排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张O ...

  7. C# DataTable扩展方法

    在日常搬砖中,总结了一些简单的扩展方法. public static bool IsNullOrEmpty(this DataTable dt) { ; } public static bool Is ...

  8. Uedior上传大文件超时报错

    出错原因: 1.php超时等待时间太短 2.uedior中设置了请求超时,提示信息: 上传失败,请重试 先解决第一个问题: 设置php.ini中的max_execution_time 为0 (意思是h ...

  9. Python学习【第3篇】:Python之运算符

    一.运算符 计算机可以进行的运算有很多种,不只是加减乘除,它和我们人脑一样,也可以做很多运算. 种类:算术运算,比较运算,逻辑运算,赋值运算,成员运算,身份运算,位运算,今天我们先了解前四个. 算术运 ...

  10. golang实现高阶函数之map

    package main import "fmt" func iMap(num []int, f func(a int) int) []int{ var r []int for _ ...