2120: 数颜色

Time Limit: 6 Sec  Memory Limit: 259 MB
Submit: 6430  Solved: 2562
[Submit][Status][Discuss]

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。

2016.3.2新加数据两组by Nano_Ape

代码:
  1. //注意到颜色范围只有1e6,修改操作不超过1000。分块,用pre[i]记录col[i]上一次出现的位置,每一块中的pre数组
  2. //从小到大排序,然后二分找到有几个的pre在询问区间的左端点的左边就是有几种数,两边的区间暴力找。修改时暴力
  3. //修改,更新pre,nex。
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<cstring>
  7. #include<cmath>
  8. #include<algorithm>
  9. using namespace std;
  10. const int MAXN=;
  11. int n,m,B,cnt,block[MAXN],pre[MAXN],nex[MAXN],last[],p[MAXN],col[MAXN];
  12. void resort(int x)
  13. {
  14. int l=(x-)*B+,r=min(n,x*B);
  15. for(int i=l;i<=r;i++) p[i]=pre[i];
  16. sort(p+l,p+r+);
  17. }
  18. void build()
  19. {
  20. for(int i=;i<=n;i++){
  21. scanf("%d",&col[i]);
  22. pre[i]=last[col[i]];
  23. if(last[col[i]]) nex[last[col[i]]]=i;
  24. last[col[i]]=i;
  25. block[i]=(i-)/B+;
  26. }
  27. for(int i=;i<=cnt;i++) resort(i);
  28. }
  29. int find(int x,int ql)
  30. {
  31. int l=(x-)*B+,r=x*B,ans=;
  32. int st=l;
  33. while(l<=r){
  34. int mid=(l+r)>>;
  35. if(p[mid]<ql) { ans=mid-st+;l=mid+; }
  36. else r=mid-;
  37. }
  38. return ans;
  39. }
  40. int query(int ql,int qr)
  41. {
  42. int s=;
  43. for(int i=ql;i<=min(n,block[ql]*B);i++)
  44. if(pre[i]<ql) s++;
  45. if(block[ql]!=block[qr]){
  46. for(int i=(block[qr]-)*B+;i<=qr;i++)
  47. if(pre[i]<ql) s++;
  48. }
  49. for(int i=block[ql]+;i<block[qr];i++) s+=find(i,ql);
  50. return s;
  51. }
  52. void update(int x,int y)
  53. {
  54. col[x]=y;
  55. if(nex[x]) { pre[nex[x]]=pre[x];resort(block[nex[x]]); }
  56. if(pre[x]) nex[pre[x]]=nex[x];
  57. int pr=,ne=;
  58. for(int i=x-;i>=;i--)
  59. if(col[i]==y) { pr=i;break; }
  60. for(int i=x+;i<=n;i++)
  61. if(col[i]==y) { ne=i;break; }
  62. pre[x]=pr;nex[x]=ne;
  63. resort(block[x]);
  64. if(pr) nex[pr]=x;
  65. if(ne) { pre[ne]=x;resort(block[ne]); }
  66. }
  67. int main()
  68. {
  69. //freopen("in.txt","r",stdin);
  70. memset(last,,sizeof(last));
  71. scanf("%d%d",&n,&m);
  72. B=sqrt(n);
  73. cnt=n/B+(n%B!=);
  74. build();
  75. while(m--){
  76. char ch[];
  77. int x,y;
  78. scanf("%s%d%d",ch,&x,&y);
  79. if(ch[]=='Q') printf("%d\n",query(x,y));
  80. else update(x,y);
  81. }
  82. return ;
  83. }

bzoj 2120的更多相关文章

  1. BZOJ 2120 数颜色(带修改的莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 3478  Solved: 1342 [Submit][Status][Discus ...

  2. BZOJ 2120: 数颜色

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

  3. BZOJ 2120: 数颜色 分块

    2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  4. 【BZOJ 2453|bzoj 2120】 2453: 维护队列 (分块+二分)

    2453: 维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有 ...

  5. Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset

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

  6. bzoj 2120 带修改莫队

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

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

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

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

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

  9. BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...

随机推荐

  1. unload没有用

    今天下午测试了unload这个事件包括beforeunload <script type="text/javascript"> window.addEventListe ...

  2. Beta发布—视频展示

    视频链接:http://v.youku.com/v_show/id_XMzE3ODQ0NjIzMg==.html视频简要内容介绍:1.一个小小的logo展示.2.在alpha的基础上,beta发布中增 ...

  3. class 3 求数组中的最大值(单元测试)

    1.问题引出: int Largest(int list[], int length) { int i,max; ; i < (length – ); i ++ ) { if(list[i] & ...

  4. 001_JavaWeb之Servlet的路径映射问题

    001_JavaWeb之Servlet的路径映射问题 在web.xml中写入: <servlet> <servlet-name>DeleteStudent</servle ...

  5. 监控MySQL服务器主从同步异常的脚本,出现异常,报警

    监控主从复制的指标有: Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0 (从服务器与主服务器延时多少秒) # ...

  6. [转帖] 磁盘IOPS 简介 -- 虽然自己知道有这么一回事 但是自己还是没有系统的总结.

    来源: https://www.cnblogs.com/zengkefu/p/5634299.html 机械硬盘的连续读写性很好, 但随机读写性能很差.这是因为磁头移动至正确的磁道上需要时间,随机读写 ...

  7. C++模板常用功能讲解

    前言 泛型编程是C++继面向对象编程之后的又一个重点,是为了编写与具体类型无关的代码.而模板是泛型编程的基础.模板简单来理解,可以看作是用宏来实现的,事实上确实有人用宏来实现了模板类似的功能.模板,也 ...

  8. File FileStream StreamReader StreamWriter C#

    存在各种各样的IO设备,比如说文件File类(字符串文件和二进制文件),可以直接使用File类对文件进行读写操作. 这些各种IO的读取和写入是通过流的形式实现的,基类为Stream,针对各种不同的IO ...

  9. 计算机网络【6】—— 从浏览器输入URL到显示页面发生了什么

    当在浏览器地址栏输入网址,如:www.baidu.com后浏览器是怎么把最终的页面呈现出来的呢?这个过程可以大致分为两个部分:网络通信和页面渲染. 一.网络通信 互联网内各网络设备间的通信都遵循TCP ...

  10. php三种方法从控制结构或脚本中跳出

    PHP中,如果希望停止一段代码,根据需要达到的效果不同,可以有三种方法实现: 1. break: 如果在循环中使用了break语句,脚本就会从循环体后面的第一条语句开始执行: 2. continue: ...