本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

Description

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?

Input

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

Output

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

Sample Input

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6

Sample Output

4
4
3
4

HINT

对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。

 
正解:带修改莫队
解题报告:
  这道题的数据范围很小,以前写过两次,不过用的是暴力和分块。
  今天学可修改的莫队,发现这是一道模板题就顺便写了。
  因为莫队是通过改变询问的顺序来降低整体复杂度,而带修改的话就没办法处理先后顺序的问题了。我们考虑加入修改操作之后如何保证算法复杂度。
  因为查询操作只有在查询操作之前的所有修改操作完成之后才能保证正确性,也就是说我只要记录了之前有多少个修改操作,然后在执行到当前查询的时候我把多进行的修改操作还原,少进行的再进行修改就可以保证我的正确性。
  同时为了保证复杂度,采取的策略是对于每个询问按$(l/block,r/block,time)$排序(分别表示l所在的块、r所在的询问之前的修改次数),再顺序完成,根据复杂度证明可以保证复杂度上界为$O(n^ {\frac{5}{3}} )$。
 
  1. //It is made by ljh2000
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <ctime>
  9. #include <vector>
  10. #include <queue>
  11. #include <map>
  12. #include <set>
  13. #include <string>
  14. using namespace std;
  15. typedef long long LL;
  16. const int MAXN = ;
  17. int n,m,a[MAXN],last[MAXN],cnt1,cnt2,block;
  18. int L,R,head,ans,cnt[],A[MAXN];
  19. char ch[];
  20. struct ask{int l,r,lb,rb,tim,id;}q[MAXN];
  21. struct modify{int x,y,last;}r[MAXN];
  22. inline bool cmp(ask q,ask qq){
  23. if(q.lb==qq.lb) {
  24. if(q.rb==qq.rb) return q.tim<qq.tim;
  25. return q.rb<qq.rb;
  26. }
  27. return q.lb<qq.lb;
  28. }
  29. inline int getb(int x){ return (x-)/block+; }
  30. inline int getint(){
  31. int w=,q=; char c=getchar(); while((c<''||c>'') && c!='-') c=getchar();
  32. if(c=='-') q=,c=getchar(); while (c>=''&&c<='') w=w*+c-'',c=getchar(); return q?-w:w;
  33. }
  34.  
  35. inline void change(int x,int col){
  36. if(L<=x&&x<=R) {
  37. cnt[a[x]]--; if(cnt[a[x]]==) ans--;
  38. a[x]=col;
  39. if(cnt[a[x]]==) ans++; cnt[a[x]]++;
  40. }
  41. else a[x]=col;
  42. }
  43.  
  44. inline void update(int x,int type){
  45. int cun=cnt[a[x]]; cnt[a[x]]+=type;
  46. if(cun== && cnt[a[x]]==) ans++;
  47. else if(cun== && cnt[a[x]]==) ans--;
  48. }
  49.  
  50. inline void work(){
  51. n=getint(); m=getint(); for(int i=;i<=n;i++) a[i]=getint(),last[i]=a[i];
  52. block=sqrt(n);
  53. for(int i=;i<=m;i++) {
  54. scanf("%s",ch);
  55. if(ch[]=='R') {
  56. r[++cnt1].x=getint();
  57. r[cnt1].y=getint();
  58. r[cnt1].last=last[r[cnt1].x];
  59. last[r[cnt1].x]=r[cnt1].y;
  60. }
  61. else{
  62. q[++cnt2].l=getint(); q[cnt2].r=getint(); q[cnt2].id=cnt2;
  63. q[cnt2].lb=getb(q[cnt2].l); q[cnt2].rb=getb(q[cnt2].r);
  64. q[cnt2].tim=cnt1;
  65. }
  66. }
  67. sort(q+,q+cnt2+,cmp); L=; R=; head=;
  68. for(int i=;i<=cnt2;i++) {
  69. while(head>q[i].tim) {
  70. change(r[head].x,r[head].last);
  71. head--;
  72. }
  73. while(head<q[i].tim) {
  74. head++;
  75. change(r[head].x,r[head].y);
  76. }
  77. while(R<q[i].r) R++,update(R,);
  78. while(L>q[i].l) L--,update(L,);
  79. while(R>q[i].r) update(R,-),R--;
  80. while(L<q[i].l) update(L,-),L++;
  81. A[q[i].id]=ans;
  82. }
  83. for(int i=;i<=cnt2;i++) printf("%d\n",A[i]);
  84. }
  85.  
  86. int main()
  87. {
  88. work();
  89. return ;
  90. }

BZOJ2120 数颜色(带修改莫队)的更多相关文章

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

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

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

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

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

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

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

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

  5. bzoj2120 数颜色——带修莫队

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 带修改的莫队: 用结构体存下修改和询问,排好序保证时间后就全局移动修改即可: 参考了T ...

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

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

  7. BZOJ2120 数颜色 —— 待修改莫队

    题目链接:https://vjudge.net/problem/HYSBZ-2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit:  ...

  8. P1903 [国家集训队]数颜色 带修改莫队板子

    大概就是要多加一维time 然后按照(l的块,r的块,time)为关键字排序 转移区间修改还是按照莫队的方式(每个修改要记修改前后的状态) 然后玄学dalao告诉窝块大小设为\(O(n^{\frac{ ...

  9. COGS.1901.[模板][国家集训队2011]数颜色(带修改莫队)

    题目链接 COGS BZOJ2120 洛谷P1903 /* Add和Subd函数中的vis不能直接设为=1或=0 比如 l=1,r=0 -> l=3,r=5 时,[1,5]的vis标记全都是1 ...

  10. bzoj2120: 数颜色 带修莫队

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

随机推荐

  1. BZOJ 3295 【Cqoi2011】 动态逆序对

    Description 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n\)的一个排列,按照某种顺序依 ...

  2. iOS开发 传感器(加速计、摇一摇、计步器)

    一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...

  3. hadoop家族之pig入门

    昨天成功运行第一个在hadoop集群上面的python版本的wordcount,今天白天继续看网上提供的文档.下午上头给定的回复是把hadoop家族都熟悉一下,那就恭敬不如从命,开始学习pig吧- 这 ...

  4. 页面跳转Transfer与Redirect的区别你知道吗?

    一 前言 关于页面跳转的方式常用的应该就是,链接跳转,js跳转,Server.Tranfser和Response.Redirect 这几种,可是在Tranfser与Redirect之间用哪种更好(本文 ...

  5. C#基础之IEnumerable

    1.IEnumerable的作用 在使用Linq查询数据时经常以IEnumerable<T>来作为数据查询返回对象,在使用foreach进行遍历时需要该对象实现IEnumerable接口, ...

  6. CSS 颜色代码大全

    CSS颜色: 转载:http://www.cnblogs.com/axing/archive/2011/04/09/CSS.html

  7. jQuery升级踩坑大全

    jQuery升级踩坑大全 背景 jQuery想必各个web工程师都再熟悉不过了,不过现如今很多网站还采用了很古老的jQuery版本.其实如果早期版本使用不当,可能会有DOMXSS漏洞,非常建议升级到j ...

  8. 自己留存:小经验在asp.net 4.5或者asp.net mvc 5解决A potentially dangerous Request.Form value was detected from the client

    以前的解决办法是 <configuration>    <system.web>        <pages  validateRequest="false&q ...

  9. Python3.5 + django1.8.5 安装”import pymysql pymysql.install_as_MySQLdb()”的解决方法

    最近在学习Python,打算先看两个在线教程,再在github上找几个开源的项目练习一下,在学到"被解放的姜戈"时遇到django同步数据库时无法执行的错误,记录一下. 错误现象: ...

  10. 如何采集QQ群中所有成员QQ号码

    安装Google Chrome浏览器 安装Google插件:Regex Scraper 在群成员页面点击Regex 插件, 粘贴上这个代码 text_overflow">([\S\s] ...