[SDOI2008]郁闷的小JJ

题目描述

小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的书共多少本。

输出格式:

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

输入输出样例

如果输入了

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

0

2

说明

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

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


treap大模板题

(话说这样的题目都只能是模板题吧)

先把书编码离散化

对每一种书都种一棵treap 这对array选手不友好啊

之后还是熟悉的操作

代码蒯上

  1. #include<iostream>
  2. #include<iomanip>
  3. #include<cmath>
  4. #include<map>
  5. #include<cstdio>
  6. #include<cstdlib>
  7. #include<cstring>
  8. #include<algorithm>
  9. using namespace std;
  10. inline int gotcha()
  11. {
  12. register int _a=0;bool _b=1;register char _c=getchar();
  13. while(_c<'0' || _c>'9'){if(_c=='-')_b=0;_c=getchar();}
  14. while(_c>='0' && _c<='9')_a=_a*10+_c-48,_c=getchar();
  15. return _b?_a:-_a;
  16. }
  17. #define ml make_pair
  18. const int _ = 100002;int seed=19260817;
  19. inline int ou(){return seed=seed*47281ll%2147483647;}
  20. typedef struct node* point;
  21. point null;
  22. struct node
  23. {
  24. int rn,sz,d;
  25. point lc,rc;
  26. node(int got){d=got,rn=ou(),sz=1,lc=rc=null;}
  27. inline void up(){sz=lc->sz+rc->sz+1;}
  28. inline void del(){if(this!=null)lc->del(),rc->del(),delete this;}
  29. };
  30. point root[_];int bk[_],lmp=0,m,n;
  31. map<int,int> mp;
  32. inline point merge(point a,point b)
  33. {
  34. if(a==null)return b;if(b==null)return a;
  35. if(a->rn<b->rn){a->rc=merge(a->rc,b),a->up();return a;}
  36. else{b->lc=merge(a,b->lc),b->up();return b;}
  37. }
  38. inline pair<point,point> split(point now,int num)
  39. {
  40. if(now==null)return ml(null,null);
  41. point lc=now->lc,rc=now->rc;
  42. if(now->lc->sz==num){now->lc=null,now->up();return ml(lc,now);}
  43. if(now->lc->sz+1==num){now->rc=null,now->up();return ml(now,rc);}
  44. if(num<now->lc->sz)
  45. {
  46. pair<point,point> T=split(now->lc,num);
  47. now->lc=T.second,now->up();
  48. return ml(T.first,now);
  49. }
  50. else
  51. {
  52. pair<point,point> T=split(now->rc,num-now->lc->sz-1);
  53. now->rc=T.first,now->up();
  54. return ml(now,T.second);
  55. }
  56. }
  57. int time_finder(int kind,int num)
  58. {
  59. int s=0,t=2e9;point now=root[kind];
  60. while(now!=null)
  61. {
  62. if(num==now->d)t=min(t,s+now->lc->sz+1);
  63. if(num<=now->d)now=now->lc;
  64. else s+=now->lc->sz+1,now=now->rc;
  65. }
  66. return t==2e9?s:t;
  67. }
  68. void insert(int num){if(mp.find(num)==mp.end())mp[num]=++lmp;}
  69. int main()
  70. {
  71. mp.clear();
  72. register int i,j,k;register char op;
  73. n=gotcha(),m=gotcha();
  74. null=new node(0),null->sz=0;
  75. for(i=0;i<_;i++)root[i]=null;
  76. for(i=1;i<=n;i++)
  77. {
  78. j=gotcha();
  79. insert(j),bk[i]=mp[j],root[bk[i]]=merge(root[bk[i]],new node(i));
  80. }
  81. while(m--)
  82. {
  83. op=getchar();while(op!='C' && op!='Q')op=getchar();
  84. if(op=='Q')
  85. {
  86. i=gotcha()-1,j=gotcha(),k=gotcha();
  87. insert(k),k=mp[k];
  88. printf("%d\n",time_finder(k,j)-time_finder(k,i));
  89. }
  90. else
  91. {
  92. i=gotcha(),k=bk[i];
  93. pair<point,point> a,b;
  94. a=split(root[k],time_finder(k,i)-1),b=split(a.second,1);
  95. delete b.first;
  96. root[k]=merge(a.first,b.second);
  97. k=gotcha(),insert(k);
  98. bk[i]=mp[k],k=mp[k];
  99. a=split(root[k],time_finder(k,i));
  100. root[k]=merge(a.first,merge(new node(i),a.second));
  101. }
  102. }
  103. for(i=0;i<_;i++)root[i]->del();delete null;
  104. return 0;
  105. }

fhqtreap - Luogu 2464 [SDOI2008]郁闷的小J的更多相关文章

  1. [SDOI2008]郁闷的小J(分块)

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

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

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

  3. P2464 [SDOI2008]郁闷的小J

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

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

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

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

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

  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. JAVA 员工管理系统(用抽象类实现),简易版。

    package Demo513; /* 定义一个Employee类,该类包含: private 成员变量name,number,birthday,其中birthday为MyDate类的对象: abst ...

  2. java的三大特性之一继承概述

    0.继承-----注意事项 00.子类最多只能继承一个父类(指直接继承) 01.java所有的类都是Object的子类 02.JPK6.0中有202个包3777个类,接口,异常,枚举,注释和错误 03 ...

  3. vue-cli3项目优化首页加载过慢的一些心得

    博主最近发现vue-cli3项目做完后,点击首页加载时间好久啊,一般都要3-5s.这样的加载时间博主自己都受不了,所以就有了这个随笔,将自己的一些研究心得分享给大家. 首先推荐大家下载一个webpac ...

  4. [nmon]使用nmon工具监控系统资源

    1.下载nmon 下载正确的nmon版本, 查看linux服务器版本,命令:lsb_release -a,查看到当前系统为RedHat 6.4 然后我们根据我们的linux版本,下载相应nmon版本, ...

  5. CefSharp试用

    Github地址: https://github.com/cefsharp/CefSharp 首先下载所有源代码下来 然后直接打开Sln 然后就可以直接调试WinForm.Wpf的Example了 注 ...

  6. 将SQL2008升级为SQL2008 r2

    我的SQL2008版本信息 Microsoft SQL Server Management Studio     10.0.1600.22 ((SQL_PreRelease).080709-1414 ...

  7. ansible 任务委派 delegate_to

    ansible 任务委派功能delegate_to run_noce: true  在一个主机上面只执行一次一个任务. ,如果没有这个参数的话,每个playbook中的组的主机都会执行一次. 我们有的 ...

  8. python实现单链表翻转

    题目描述: 翻转一个链表 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 挑 ...

  9. HTML_2

    html图像 <img>标签可以在网页上插入一张图片,它是独立使用的标签,通过‘src’属性定义图片的地址(可为绝对路径也可为相对路径),通过‘alt’属性定义图片加载时显示的文字,以及对 ...

  10. DROP OPERATOR CLASS - 删除一个操作符类

    SYNOPSIS DROP OPERATOR CLASS name USING index_method [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP OPER ...