2453: 维护队列

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1079  Solved: 503
[Submit][Status][Discuss]

Description

你小时候玩过弹珠吗?
小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N。为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少。当然,A有时候会依据个人喜好,替换队列中某个弹珠的颜色。但是A还没有学过编程,且觉得头脑风暴太浪费脑力了,所以向你来寻求帮助。

Input

输入文件第一行包含两个整数N和M。
第二行N个整数,表示初始队列中弹珠的颜色。
接下来M行,每行的形式为“Q L R”或“R x c”,“Q L R”表示A想知道从队列第L个弹珠到第R个弹珠中,一共有多少不同颜色的弹珠,“R x c”表示A把x位置上的弹珠换成了c颜色。

Output

对于每个Q操作,输出一行表示询问结果。

Sample Input

2 3
1 2
Q 1 2
R 1 2
Q 1 2

Sample Output

2
1

HINT

对于100%的数据,有1 ≤ N ≤ 10000, 1 ≤ M ≤ 10000,小朋友A不会修改超过1000次,所有颜色均用1到10^6的整数表示。

Source

2011福建集训

带修莫队

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define N 10001
  5. #define M 1000001
  6. using namespace std;
  7. int n,m,col[M],sum[M],ans[N];
  8. int tot,now,siz,tmp;
  9. struct Query
  10. {
  11. int l,r,bl,id,tim;
  12. bool operator < (Query p) const
  13. {
  14. if(bl!=p.bl) return bl<p.bl;
  15. if(r!=p.r) return r<p.r;
  16. return tim<p.tim;
  17. }
  18. }e[N];
  19. struct Change
  20. {
  21. int be,af,pos;
  22. }g[];
  23. void update(int p,int w)
  24. {
  25. sum[p]+=w;
  26. if(sum[p]== && w==) tmp++;
  27. if(!sum[p] && w==-) tmp--;
  28. }
  29. int main()
  30. {
  31. scanf("%d%d",&n,&m);
  32. siz=sqrt(n);
  33. for(int i=;i<=n;i++) scanf("%d",&col[i]);
  34. char s[]; int l,r;
  35. while(m--)
  36. {
  37. scanf("%s%d%d",s,&l,&r);
  38. if(s[]=='Q')
  39. {
  40. e[++tot].l=l; e[tot].r=r; e[tot].bl=(l-)/siz; e[tot].tim=now;
  41. e[tot].id=tot;
  42. }
  43. else
  44. {
  45. g[++now].pos=l; g[now].af=r;
  46. }
  47. }
  48. sort(e+,e+tot+);
  49. int L=,R=; now=;
  50. for(int i=;i<=tot;i++)
  51. {
  52. while(now<e[i].tim)
  53. {
  54. now++;
  55. g[now].be=col[g[now].pos];
  56. if(g[now].pos>=L&&g[now].pos<=R)
  57. {
  58. update(g[now].be,-);
  59. update(g[now].af,);
  60. }
  61. col[g[now].pos]=g[now].af;
  62. }
  63. while(now>e[i].tim)
  64. {
  65. if(g[now].pos>=L&&g[now].pos<=R)
  66. {
  67. update(g[now].af,-);
  68. update(g[now].be,);
  69. }
  70. col[g[now].pos]=g[now].be;
  71. now--;
  72. }
  73. while(e[i].l<L) update(col[--L],);
  74. while(e[i].l>L) update(col[L++],-);
  75. while(e[i].r>R) update(col[++R],);
  76. while(e[i].r<R) update(col[R--],-);
  77. ans[e[i].id]=tmp;
  78. }
  79. for(int i=;i<=tot;i++) printf("%d\n",ans[i]);
  80. }

优化后:

读入优化、1,-1改成 true,false

优化一半

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define N 10001
  5. #define M 1000001
  6. using namespace std;
  7. int n,m,col[M],sum[M],ans[N];
  8. int tot,now,siz,tmp;
  9. struct Query
  10. {
  11. int l,r,bl,id,tim;
  12. bool operator < (Query p) const
  13. {
  14. if(bl!=p.bl) return bl<p.bl;
  15. if(r!=p.r) return r<p.r;
  16. return tim<p.tim;
  17. }
  18. }e[N];
  19. struct Change
  20. {
  21. int be,af,pos;
  22. }g[];
  23. void update(int p,bool w)
  24. {
  25. if(w)
  26. {
  27. sum[p]++;
  28. if(sum[p]==) tmp++;
  29. }
  30. else
  31. {
  32. sum[p]--;
  33. if(!sum[p]) tmp--;
  34. }
  35. }
  36. void read(int &x)
  37. {
  38. x=; char c=getchar();
  39. while(c<''||c>'') c=getchar();
  40. while(c>=''&&c<='') { x=x*+c-''; c=getchar(); }
  41. }
  42. int main()
  43. {
  44. read(n); read(m);
  45. siz=sqrt(n);
  46. for(int i=;i<=n;i++) read(col[i]);
  47. char s[]; int l,r;
  48. while(m--)
  49. {
  50. scanf("%s",s);
  51. read(l); read(r);
  52. if(s[]=='Q')
  53. {
  54. e[++tot].l=l; e[tot].r=r; e[tot].bl=(l-)/siz; e[tot].tim=now;
  55. e[tot].id=tot;
  56. }
  57. else
  58. {
  59. g[++now].pos=l; g[now].af=r;
  60. }
  61. }
  62. sort(e+,e+tot+);
  63. int L=,R=; now=;
  64. for(int i=;i<=tot;i++)
  65. {
  66. while(now<e[i].tim)
  67. {
  68. now++;
  69. g[now].be=col[g[now].pos];
  70. if(g[now].pos>=L&&g[now].pos<=R)
  71. {
  72. update(g[now].be,false);
  73. update(g[now].af,true);
  74. }
  75. col[g[now].pos]=g[now].af;
  76. }
  77. while(now>e[i].tim)
  78. {
  79. if(g[now].pos>=L&&g[now].pos<=R)
  80. {
  81. update(g[now].af,false);
  82. update(g[now].be,true);
  83. }
  84. col[g[now].pos]=g[now].be;
  85. now--;
  86. }
  87. while(e[i].l<L) update(col[--L],true);
  88. while(e[i].l>L) update(col[L++],false);
  89. while(e[i].r>R) update(col[++R],true);
  90. while(e[i].r<R) update(col[R--],false);
  91. ans[e[i].id]=tmp;
  92. }
  93. for(int i=;i<=tot;i++) printf("%d\n",ans[i]);
  94. }

bzoj 2453: 维护队列的更多相关文章

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

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 247[Submit][Status][Discuss] ...

  2. bzoj 2453 : 维护队列 带修莫队

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 952  Solved: 432[Submit][Status][Discuss] ...

  3. BZOJ 2453 维护队列 | 分块

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题解: 考虑维护每个位置的颜色上一次出现在哪里,计为pre[i],在询问l到r的时候, ...

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

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

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

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

  6. BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】

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

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

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

  8. 【BZOJ】2453: 维护队列【BZOJ】2120: 数颜色 二分+分块(暴力能A)

    先说正解:把所有相同的数相成一个链在每一个区间里的种数就是不同链的链头,那么记录每个数的上个相同数所在位置,那么只要找出l到r之间前驱值在l之前的数的个数就可以了 本人打的暴力,有一个小技巧,用cha ...

  9. [bzoj] 2453 维护数列 || 单点修改分块

    原题 询问区间有种个颜色,单点修改某个位置. 修改次数<=1000 维护pre[i]为前一个与当前位置颜色一样的位置. 询问时以pre为关键字sort,lower_bound找pre<x的 ...

随机推荐

  1. Ubuntu系统升级内核方法

    一.查看内核版本 $ uname-sr //查看内核版本 二.去Ubuntu网站http://kernel.ubuntu.com/~kernel-ppa/mainline/下载所需版本的deb文件 w ...

  2. 数据挖掘聚类算法(DBSCAN、Kmeans)Java实现

    学习聚类算法时,参考算法说明随手写的java实现,代码很简单,不多做说明啦,有需要的童鞋可以看看,自己也做个备录. http://files.cnblogs.com/files/yuananyun/% ...

  3. Matlab中TCP通讯-实现外部程序提供优化目标函数解

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Matlab中TCP通讯-实现外部程序提供优化目标函数解     本文地址:http://te ...

  4. 更新 pip & setuptools

    python -m pip install -U pip setuptools

  5. 使用JMeter录制Web应用测试脚本

    环境 操作系统:Windows 7 工具:JMeter.Badboy 1. 使用代理录制Web性能测试脚本 使用代理录制脚本来创建测试计划无疑是一个简便的方法,代理所要完成的工作就是录制发往服务器的请 ...

  6. jQuery 获取和设置radio 和 checkbox 值的操作

    jquery 中的val(),可以取值也可赋值,表单元素中的radio和checkbox是比较常用的控件,下面说说对它们的取值和赋值的使用 1.取值 表单如下: <div class=" ...

  7. [六]SpringBoot 之 连接数据库(mybatis)

    在进行配置之前首先要了解springboot是如何使用纯java代码方式初始化一个bean的 以前的版本是在xml中使用beans标签,在其里面配置bean,那么纯Java代码怎么实现呢? 答案就是使 ...

  8. Class类是什么? Class.forName()是干什么的?

    Class类概念 Class类用来描述一个类的结构,比如描述一个类有哪些成员,有哪些方法等.有多种方法可以获取一个类对应的Class类实例,比如: //第一种方式获取描述Dog类结构的Class类实例 ...

  9. TCP(Transmission Control Protocol)学习笔记

    一.TCP(Transmission Control Protocol)原理介绍(参考维基百科) TCP连接包括三种状态:连接建立.数据传送和连接终止. TCP用三路握手(three-way hand ...

  10. Visual Format Language(VFL)视图约束

    约束(Constraint)在IOS编程中非常重要,这关乎到用户的直接体验问题. IOS中视图约束有几种方式,常见的是在IB中通过Pin的方式手动添加约束,菜单Editor->Pin->. ...