2453: 维护队列

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 183  Solved: 89
[Submit][Status]

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

题解:

用pre[i]记录前一个和i相同颜色的球的所在位置

询问l到r时,如果pre[i]<r说明在l到i这一段没用和i颜色相同的球,则ans++

利用这种思路我们可以。。。分块

每一块内按pre[i]排序,然后和教主的魔法那题都一样了

-----hzwer

代码:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<iostream>
  7. #include<vector>
  8. #include<map>
  9. #include<set>
  10. #include<queue>
  11. #include<string>
  12. #define inf 1000000000
  13. #define maxn 10000+1000
  14. #define maxm 1000000+1000
  15. #define eps 1e-10
  16. #define ll long long
  17. #define pa pair<int,int>
  18. using namespace std;
  19. inline int read()
  20. {
  21. int x=,f=;char ch=getchar();
  22. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  23. while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
  24. return x*f;
  25. }
  26. int n,m,block,b[maxn],c[maxn],pre[maxn],pos[maxn],last[maxm];
  27. void reset(int x)
  28. {
  29. int l=(x-)*block+,r=min(x*block,n);
  30. for(int i=l;i<=r;i++)pre[i]=b[i];
  31. sort(pre+l,pre+r+);
  32. }
  33. int find(int x,int y)
  34. {
  35. int l=(x-)*block+,r=x*block,mid;
  36. while(l<=r)
  37. {
  38. mid=(l+r)>>;
  39. if(pre[mid]>=y)r=mid-;else l=mid+;
  40. }
  41. return l-(x-)*block-;
  42. }
  43. int query(int x,int y)
  44. {
  45. int sum=,bx=pos[x],by=pos[y];
  46. if(by-bx<=)
  47. {
  48. for(int i=x;i<=y;i++)if(b[i]<x)sum++;
  49. }
  50. else
  51. {
  52. for(int i=x;i<=bx*block;i++)if(b[i]<x)sum++;
  53. for(int i=(by-)*block+;i<=y;i++)if(b[i]<x)sum++;
  54. }
  55. for(int i=bx+;i<by;i++)sum+=find(i,x);
  56. return sum;
  57. }
  58. void change(int x,int y)
  59. {
  60. for(int i=;i<=n;i++)last[c[i]]=;
  61. c[x]=y;
  62. for(int i=;i<=n;i++)
  63. {
  64. int t=b[i];
  65. b[i]=last[c[i]];
  66. last[c[i]]=i;
  67. if(t!=b[i])reset(pos[i]);
  68. }
  69. }
  70. int main()
  71. {
  72. freopen("input.txt","r",stdin);
  73. freopen("output.txt","w",stdout);
  74. n=read();m=read();
  75. block=floor(sqrt(n));
  76. for(int i=;i<=n;i++)
  77. {
  78. c[i]=read();
  79. pos[i]=(i-)/block+;
  80. b[i]=last[c[i]];
  81. last[c[i]]=i;
  82. }
  83. for(int i=;i<=pos[n];i++)reset(i);
  84. char ch;int x,y;
  85. while(m--)
  86. {
  87. ch=' ';
  88. while(ch!='Q'&&ch!='R')ch=getchar();x=read();y=read();
  89. if(ch=='R')change(x,y);else printf("%d\n",query(x,y));
  90. }
  91. return ;
  92. }

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

  1. [bzoj2453]维护队列_带修改莫队

    维护队列 bzoj-2453 题目大意:给定一个n个数序列,支持查询区间数的种类数,单点修改.不强制在线. 注释:$1\le n,m\le 10^5$. 想法: 带修改莫队裸题. 如果没有修改操作的话 ...

  2. [BZOJ2453]维护队列|分块

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

  3. BZOJ2453维护队列&&BZOJ2120数颜色

    2016-05-28 11:20:22 共同的思路: 维护某种颜色上一次在哪里出现pre,可以知道当pre<询问的l时更新答案 块内按照pre排序 修改的时候重新O(n)扫一遍,如果和之前的不一 ...

  4. bzoj2120: 数颜色 &&bzoj2453: 维护队列

    题目大意: 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好 ...

  5. 【分块】bzoj2453 维护队列

    http://www.cnblogs.com/autsky-jadek/p/4020296.html 同bzoj2120. #include<cstdio> #include<cma ...

  6. [BZOJ2120] 数颜色 && [bzoj2453] 维护队列(莫队 || 分块)

    传送门 只有第一个,第二个权限题. 分块,然而wa,没看出来错在哪里,有时间再看. #include <cmath> #include <cstdio> #include &l ...

  7. 【BZOJ2453】维护队列/【BZOJ2120】数颜色 分块

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

  8. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

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

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

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

随机推荐

  1. c# 根据自定义Attribute排序

    add a class: public class ExportAttribute : Attribute {     public int FieldOrder { get; set; }      ...

  2. Transact-SQL 数据类型转换

    Syntax   Syntax for CAST: CAST ( expression AS data_type [ ( length ) ] )     Syntax for CONVERT: CO ...

  3. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

  4. 杭电 2047 阿牛的EOF牛肉串 (递推)

    阿牛的EOF牛肉串 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  5. 【剑指offer】链表倒数第k个节点

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在 ...

  6. RHEL7查看网卡配置命令ip addr show

    Validating Network Address Configuration To verify the configuration of the network address, you nee ...

  7. (转)C#读取文件路径

    //获取包含清单的已加载文件的路径或 UNC 位置. public static string sApplicationPath = Assembly.GetExecutingAssembly ( ) ...

  8. smokeping报错Can't locate RRDs.pm in @INC (@INC contains

    安装完smokeping,执行debug语句: ./bin/smokeping --debug-daemon ,提示如下错误: Can't locate RRDs.pm in @INC (@INC c ...

  9. CAGradientLayer实现色差动画

    效果图: 代码部分: RPGradientAnimationView.h #import <UIKit/UIKit.h> typedef enum : NSUInteger { RPGra ...

  10. C#中数据源绑定DataSource以及相关控件(DataGridView)的使用总结

    我们在编程过程中,会涉及到表格数据的显示,存储等,就可能涉及到DataGridView,DataSource, DataTable等概念. 下面我就我自己模糊的一些知识点串讲以下: 1)首先我要讲的是 ...