[SDOI2008]郁闷的小J

题目描述

小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架。虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的。

具体说来,书架由N个书位组成,编号从1到N。每个书位放着一本书,每本书有一个特定的编码。

小J的工作有两类:

1.图书馆经常购置新书,而书架任意时刻都是满的,所以只得将某位置的书拿掉并换成新购的书。

2.小J需要回答顾客的查询,顾客会询问某一段连续的书位中某一特定编码的书有多少本。

例如,共5个书位,开始时书位上的书编码为1,2,3,4,5

一位顾客询问书位1到书位3中编码为“2”的书共多少本,得到的回答为:1

一位顾客询问书位1到书位3中编码为“1”的书共多少本,得到的回答为:1

此时,图书馆购进一本编码为“1”的书,并将它放到2号书位。

一位顾客询问书位1到书位3中编码为“2”的书共多少本,得到的回答为:0

一位顾客询问书位1到书位3中编码为“1”的书共多少本,得到的回答为:2

……

你的任务是写一个程序来回答每个顾客的询问。

输入输出格式

输入格式:

第一行两个整数N,M,表示一共N个书位,M个操作。

接下来一行共N个整数数A1,A2…AN,Ai表示开始时位置i上的书的编码。

接下来M行,每行表示一次操作,每行开头一个字符

若字符为‘C’,表示图书馆购进新书,后接两个整数A(1<=A<=N),P,表示这本书被放在位置A上,以及这本书的编码为P。

若字符为‘Q’,表示一个顾客的查询,后接三个整数A,B,K(1<=A<=B<=N),表示查询从第A书位到第B书位(包含A和B)中编码为K的书共多少本。

输出格式:

对每一个顾客的查询,输出一个整数,表示顾客所要查询的结果。

输入输出样例

输入样例#1: 复制

5 5

1 2 3 4 5

Q 1 3 2

Q 1 3 1

C 2 1

Q 1 3 2

Q 1 3 1

输出样例#1: 复制

1

1

0

2

说明

对于40%的数据,1<=N,M<=5000

对于100%的数据,1<=N,M<=100000

对于100%的数据,所有出现的书的编码为不大于2147483647的正数。

题解

一眼看上去。

分块啊!

点开标签,平衡树???

平衡树打得少告辞。

还是用分块水一下吧。

这个题目类似于教主的魔法。

我们只需要把每一个块排一遍序。

然后编号嘛。就是二分一下就好了。

每次查询一下\(O(logn \sqrt n)\)再乘上个\(m\)就可以了。

要吸氧,可能是我分块打得太垃圾了吧。

不吸只有四十分。

代码

  1. // luogu-judger-enable-o2
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. const int N=1000001;
  9. int bl[N],l[N],r[N];
  10. int a[N],ch[N];
  11. int n,m,k,tmp;
  12. int read(){
  13. int x=0,w=1;char ch=getchar();
  14. while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
  16. return x*w;
  17. }
  18. void build(){
  19. for(int i=1;i<=tmp;i++)
  20. l[i]=(i-1)*tmp+1,r[i]=i*tmp;
  21. for(int i=1;i<=n;i++)bl[i]=(i-1)/tmp+1;
  22. if(r[tmp]<n){
  23. tmp++,r[tmp]=n,l[tmp]=r[tmp-1]+1;
  24. for(int i=l[tmp];i<=n;i++)bl[i]=tmp;
  25. }
  26. for(int i=1;i<=tmp;i++){
  27. sort(a+l[i],a+r[i]+1);
  28. }
  29. }
  30. void change(int x,int y){
  31. ch[x]=y;
  32. for(int i=l[bl[x]];i<=r[bl[x]];i++)a[i]=ch[i];
  33. sort(a+l[bl[x]],a+r[bl[x]]+1);
  34. }
  35. int query(int ll,int rr,int v){
  36. int ans=0;
  37. if(bl[ll]==bl[rr]){
  38. for(int i=ll;i<=rr;i++)if(ch[i]==v)ans++;
  39. return ans;
  40. }
  41. for(int i=bl[ll]+1;i<=bl[rr]-1;i++){
  42. int lv=lower_bound(a+l[i],a+r[i]+1,v)-a;
  43. int rv=lower_bound(a+l[i],a+r[i]+1,v+1)-a-1;
  44. ans+=rv-lv+1;
  45. }
  46. for(int i=ll;i<=r[bl[ll]];i++)
  47. if(ch[i]==v)ans++;
  48. for(int i=l[bl[rr]];i<=rr;i++)
  49. if(ch[i]==v)ans++;
  50. return ans;
  51. }
  52. int main(){
  53. n=read();m=read();tmp=sqrt(n);
  54. for(int i=1;i<=n;i++){
  55. a[i]=ch[i]=read();
  56. }
  57. build();
  58. while(m--){
  59. char opt;
  60. scanf("%s",&opt);
  61. if(opt=='C'){
  62. int x=read(),y=read();
  63. change(x,y);
  64. }
  65. if(opt=='Q'){
  66. int ll=read(),rr=read(),v=read();
  67. printf("%d\n",query(ll,rr,v));
  68. }
  69. }
  70. return 0;
  71. }

[SDOI2008]郁闷的小J(分块)的更多相关文章

  1. 洛谷P2464 [SDOI2008] 郁闷的小j [分块]

    题目传送门 郁闷的小j 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也 ...

  2. fhqtreap - Luogu 2464 [SDOI2008]郁闷的小J

    [SDOI2008]郁闷的小JJ 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的 ...

  3. P2464 [SDOI2008]郁闷的小J

    题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的. 具体说 ...

  4. 【洛谷 P2464】[SDOI2008]郁闷的小J(线段树)

    题目链接 这题我很久之前用分块写过,没写出来.. 今天又看到了,于是下决心把这题做出来. 这次我用线段树写的,直接对每本书的编号Hash一下然后离散化然后各建一棵线段树,维护当前编号在某个位置有没有书 ...

  5. 2018.09.26 洛谷P2464 [SDOI2008]郁闷的小J(map+vector)

    传送门 本来出题人出出来想考数据结构的. 但是我们拥有map+vector/set这样优秀的STL,因此直接用map离散化,vector存下标在里面二分找答案就行了. 代码: #include< ...

  6. 洛谷P2464 [SDOJ2008]郁闷的小J

    洛谷P2464 [SDOJ2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他 ...

  7. 山东省选 郁闷的小J

    小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的. 具体说来,书架由 ...

  8. 【山东省选2008】郁闷的小J 平衡树Treap

    小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...

  9. HUST-1407 郁闷的小J

    离线做法:分别处理每个编号上的各种询问和操作,接着就能用树状数组维护. #include <cstdlib> #include <cstdio> #include <cs ...

随机推荐

  1. Python笔记27----时间解析

    1.将时间字符串解析成真正的时间 time.strptime http://www.runoob.com/python/att-time-strptime.html 代码: import time s ...

  2. word上怎么打钩

    原文:http://www.wordlm.com/html/2291.html 有时我们在Word中制作一份特殊的表格时,可能会用到这样一些特殊符号,“在方框里打钩”或打叉.这些符号虽看起来简单不起眼 ...

  3. iOS开发UI调试神器----Reveal

    做iOS的开发,UI是非常非常重要的一环.调试时我们一般用模拟器,提交前用真机做測试.用模拟器来调试UI效果尽管快捷方便,但有时仍然希望有更强大的工具来帮助分析UI,尤其是专注在UI的效果调试时.近期 ...

  4. oracle 10g/11g 命令对照,日志文件夹对照

     oracle 10g/11g  命令对照,日志文件夹对照 oracle 11g 中不再建议使用的命令 Deprecated Command Replacement Commands crs_st ...

  5. swift算法手记-7

    @IBAction func compute(sender: AnyObject) { // 19*x^7-31*x^5+16*x^2+7*x-90=0 // newton迭代法求一元方程的解,最大求 ...

  6. _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  7. virtio netdev的创建

    Linux眼下支持至少了8种虚拟化系统: Xen KVM VMware's VMI IBM's System p IBM's System z User Mode Linux lguest IBM's ...

  8. bzoj4568: [Scoi2016]幸运数字(LCA+线性基)

    4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...

  9. JavaScript学习记录三

    title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  10. VC6.0 设置动态链接库工程生成dll以及lib文件的位置

    在"Projet"->"Settings..."的"Link"选项卡中 "Output file name"中设置 ...