Dynamic len(set(a[L:R]))

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3767

Description

给你n个数,m次操作

Q x y 询问[x+1,y]有多少个不同的数

M x y 将第x+1个数修改成y

Input

n,50000 询问50000次,修改的y的数最大1e6

Output

Sample Input

7 4
1 2 1 3 2 1 4
Q 1 6
M 3 2
Q 1 6
Q 3 5

Sample Output

3
2
1

HINT

题意

题解:

树套树

首先我们对于每个元素,将这个数的值修改成 这个数前面离最近的数,在哪儿

比如样例 1 2 1 3 2 1 4

我们可以看出 0 0 1 0 2 3 0

然后我们每次的询问操作就是查询区间有多少个数小于l,这个就是平衡树或者主席树来解决就好了(划分树已经成为了时代的眼泪

修改的话,就得树套树,然后我们再用set维护一下这个数后面的数是什么,前面的数是什么就好了

注意,修改会修改3个数哦~

代码:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<map>
  5. #include<cstring>
  6. #include<set>
  7. #include<ctime>
  8. using namespace std;
  9. inline long long read()
  10. {
  11. long long x=,f=;char ch=getchar();
  12. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  13. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  14. return x*f;
  15. }
  16. #define maxn 1500005
  17. int tmp=;
  18. int a[maxn];
  19. int c[maxn];
  20. int b[maxn];
  21. int n,m;
  22. set<int> H[maxn];
  23. ////////////////treap
  24. struct Treap
  25. {
  26. int root[maxn],sz,s[maxn],ls[maxn],rs[maxn],v[maxn],w[maxn],rnd[maxn];
  27. void init()
  28. {
  29. memset(root,,sizeof(root));
  30. sz=;
  31. }
  32. void Updata(int k)
  33. {
  34. s[k]=s[ls[k]]+s[rs[k]]+w[k];
  35. }
  36. void Rturn(int &k)
  37. {
  38. int t;
  39. t=ls[k],ls[k]=rs[t],rs[t]=k,s[t]=s[k];
  40. Updata(k);k=t;
  41. }
  42. void Lturn(int &k)
  43. {
  44. int t;
  45. t=rs[k],rs[k]=ls[t],ls[t]=k,s[t]=s[k];
  46. Updata(k);k=t;
  47. }
  48. void Insert(int &k,int num)
  49. {
  50. if(!k)
  51. {
  52. k=++sz;s[k]=w[k]=;ls[k]=rs[k]=;rnd[k]=rand();
  53. v[k]=num;return;
  54. }
  55. s[k]++;
  56. if(v[k]==num)w[k]++;
  57. else if(num<v[k])
  58. {
  59. Insert(ls[k],num);
  60. if(rnd[ls[k]]<rnd[k])
  61. Rturn(k);
  62. }
  63. else
  64. {
  65. Insert(rs[k],num);
  66. if(rnd[rs[k]]<rnd[k])
  67. Lturn(k);
  68. }
  69. }
  70. void Del(int &k,int num)
  71. {
  72. if(v[k]==num)
  73. {
  74. if(w[k]>){
  75. w[k]--;
  76. s[k]--;
  77. return;
  78. }
  79. if(ls[k]*rs[k]==)
  80. k=ls[k]+rs[k];
  81. else if(rnd[ls[k]]<rnd[rs[k]])
  82. Rturn(k),Del(k,num);
  83. else
  84. Lturn(k),Del(k,num);
  85. }
  86. else if(num<v[k]){
  87. Del(ls[k],num);
  88. s[k]--;
  89. }
  90. else{
  91. Del(rs[k],num);
  92. s[k]--;
  93. }
  94. }
  95. void Find(int k,int num)
  96. {
  97. if(!k)return;
  98. if(v[k]<=num){
  99. tmp+=s[ls[k]]+w[k];
  100. Find(rs[k],num);
  101. }
  102. else Find(ls[k],num);
  103. }
  104. }Tr;
  105.  
  106. /////////////////////
  107.  
  108. /////////////////////线段树
  109. int lowbit(int x)
  110. {
  111. return x&(-x);
  112. }
  113. void Bit_updata(int x,int v)
  114. {
  115. if(x==)return;
  116. for(;x<=n;x+=lowbit(x))
  117. Tr.Insert(Tr.root[x],v);
  118. }
  119. void Bit_change(int x,int v)
  120. {
  121. if(x==)return;
  122. for(;x<=n;x+=lowbit(x))
  123. Tr.Del(Tr.root[x],v);
  124. }
  125. void Bit_query(int x,int num)
  126. {
  127. if(x<=)return;
  128. for(;x;x-=lowbit(x))
  129. Tr.Find(Tr.root[x],num);
  130. }
  131. ///////////////////////////
  132.  
  133. void change(int x,int y)
  134. {
  135. Bit_change(x,a[x]);
  136. H[b[x]].erase(x);
  137. int T = *H[b[x]].upper_bound(x);
  138. if(T!=n+)
  139. {
  140. Bit_change(T,x);
  141. Bit_updata(T,a[x]);
  142. a[T]=a[x];
  143. }
  144. b[x]=y;
  145. T = *--H[b[x]].upper_bound(x);
  146. a[x]=T;int MM = T;
  147. Bit_updata(x,a[x]);
  148. H[y].insert(x);
  149. T = *H[b[x]].upper_bound(x);
  150. if(T!=n+)
  151. {
  152. Bit_change(T,MM);
  153. Bit_updata(T,x);
  154. a[T]=x;
  155. }
  156. }
  157. int main()
  158. {
  159. scanf("%d%d",&n,&m);
  160. for(int i=;i<;i++)
  161. H[i].insert(),H[i].insert(n+);
  162. for(int i=;i<=n;i++)
  163. {
  164. scanf("%d",&b[i]);
  165. H[b[i]].insert(i);
  166. }
  167. for(int i=;i<=n;i++)
  168. {
  169. a[i]=c[b[i]];
  170. c[b[i]]=i;
  171. Bit_updata(i,a[i]);
  172. }
  173. char op[];int x,y;
  174. for(int i=;i<=m;i++)
  175. {
  176. scanf("%s%d%d",op,&x,&y);x++;
  177. if(op[]=='Q')
  178. {
  179. int Ans1,Ans2;
  180. tmp = ,Bit_query(y,x-),Ans1=tmp;
  181. tmp = ,Bit_query(x-,x-),Ans2=tmp;
  182. printf("%d\n",Ans1-Ans2);
  183. }
  184. else
  185. change(x,y);
  186. }
  187. }

Uva 3767 Dynamic len(set(a[L:R])) 树套树的更多相关文章

  1. (待修莫队 没过! 抽空在检查)Dynamic len(set(a[L:R])) UVA - 12345

    #include <iostream> #include <cstdio> #include <sstream> #include <cstring> ...

  2. Dynamic len(set(a[L:R])) UVA - 12345(这么过分一定要写博客)

    给出一个有n个元素的数组,有以下两种操作:Q x y,求出区间[x,y)内不同元素的个数, M x y,把第x个元素的值修改为y.注意题目中的下标是从0开始的 这题超级超级坑 妈的一个水题找了几个小时 ...

  3. 【题解】Luogu UVA12345 Dynamic len(set(a[L:R]))

    原题传送门 这题要用动态莫队,我博客里有介绍 这道题和luogu P1903 [国家集训队]数颜色 / 维护队列差不多,解法就在上面那篇博客里qaq 主要的问题是如何排序? 排序有三个关键字: 1.左 ...

  4. 【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)

    [题意] 给定一个含有n个数的序列a[1],a[2],a[3]--a[n], 程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k ...

  5. bzoj 1901: Zju2112 Dynamic Rankings(树套树)

    1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...

  6. zoj2112 Dynamic Rankings (主席树 || 树套树)

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  7. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...

  8. [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】

    题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...

  9. 【bzoj1901】dynamic ranking(带修改主席树/树套树)

    题面地址(权限题) 不用权限题的地址 首先说说怎么搞带修改主席树? 回忆一般的kth问题,我们的主席树求的是前缀和,这样我们在目标区间的左右端点的主席树差分下就能求出kth. 那么我们如何支持修改操作 ...

随机推荐

  1. 转载RabbitMQ入门(4)--路由

    路由 (使用Java客户端) 在先前的指南中,我们建立了一个简单的日志系统.我们可以将我们的日志信息广播到多个接收者. 在这部分的指南中,我们将要往其中添加一个功能-让仅仅订阅一个消息的子集成为可能. ...

  2. 【转】Masonry介绍与使用实践(快速上手Autolayout)

    原文网址:http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/ 前言 1 MagicNumber -> aut ...

  3. 【转】iOS 通过xib自定义UITableViewCell【原创】

    原文网址:http://blog.it985.com/9683.html 在使用tableView的时候,如果cell的布局过于复杂,通过代码搭建的话不够直观.并且要不停的调整位置,字体什么的.这时, ...

  4. 组以逗号分隔的子串及跨平update join

    下列语句可以对组以逗号分隔的子串 set @device_cd_array += ', ' set @device_cd_array += @nodeid ,, '') update时要join表要先 ...

  5. linux中waitpid及wait的用法

    wait(等待子进程中断或结束) 表头文件      #include<sys/types.h>      #include<sys/wait.h> 定义函数 pid_t wa ...

  6. Android WindowManager 监听返回键及home键

    一.监听home键盘,Android Home键系统负责监听,捕获后系统自动处理.有时候,我们需要监听home键处理自己的逻辑,监听方法如下: /** * 监听home键广播 */ private f ...

  7. 如何解决Rally模板提示angular js加载错误

    [前言] Rally是一个开源测试工具,用于测试openstack各个组件的性能 在使用Rally测试完毕后,一般会生成测试报告,这点很重要.但是原生态的Rally报告模板angular js框架是从 ...

  8. angular form-data文件上传

    前言:很久没更新博客,最近公司pc端技术选型用angular,这几天就赶鸭子上架,硬着头皮直接上手angular.其中有许多小坑陆陆续续踩起走.今天就遇到一个比较常见的问题:图片上传. 主题:图片上传 ...

  9. mysql_connect v/s mysql_pconnect

    原文:mysql_connect v/s mysql_pconnect 译文:mysql_connect v/s mysql_pconnect 译者:dwqs 当需要使用PHP连接MySQL数据库的时 ...

  10. 大连网络赛 1006 Football Games

    //大连网络赛 1006 // 吐槽:数据比较水.下面代码可以AC // 但是正解好像是:排序后,前i项的和大于等于i*(i-1) #include <bits/stdc++.h> usi ...