bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)


cogs

zoj

bzoj-权限


题解

bzoj和zoj都是骗访问量的233,我没有权限

带修改区间k小值,看了学习了题解一次AC真开心。。。

不带修改的是前缀和套主席树,\(O(log_2n)\)查询,要修改只能\(O(nlog_2n)\)乱搞。

把外层前缀和改成树状数组,即第\(i\)个主席树从存\(1\) ~ \(i\)的值域改成存\(i-lowbit(i)+1\) ~ \(i\)的值域。然后修改和查询都是\(O(log_2^2n)\)的。。。(一个\(log\)树状数组另一个线段树)

查询就从两个根相减变成多个根减多个根了,和bit差不多。


Code

  1. // It is made by XZZ
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define Fname "dynrank"
  5. using namespace std;
  6. #define rep(a,b,c) for(rg int a=b;a<=c;a++)
  7. #define drep(a,b,c) for(rg int a=b;a>=c;a--)
  8. #define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
  9. #define il inline
  10. #define rg register
  11. #define vd void
  12. #define lb(o) ((o)&(-(o)))
  13. #define mid ((l+r)>>1)
  14. typedef long long ll;
  15. il int gi(){
  16. rg int x=0;rg char ch=getchar();
  17. while(ch<'0'||ch>'9')ch=getchar();
  18. while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
  19. return x;
  20. }
  21. typedef struct node* point;
  22. point null;
  23. struct node{
  24. int data;
  25. point ls,rs;
  26. node(){ls=rs=null,data=0;}
  27. node(point _ls,point _rs){ls=_ls,rs=_rs,data=0;}
  28. };
  29. const int maxn=50001,maxm=10001;
  30. il vd copy(point&a,point b){
  31. if(b==null)a=null;
  32. else a=new node,*a=*b;
  33. }
  34. il vd Updata(point&s,point rt,int l,int r,int&pos,int num){
  35. copy(s,rt);
  36. s->data+=num;
  37. if(l==r)return;
  38. if(mid<pos)Updata(s->rs,rt->rs,mid+1,r,pos,num);
  39. else Updata(s->ls,rt->ls,l,mid,pos,num);
  40. }
  41. il point build(int l,int r){
  42. if(l==r)return new node;
  43. return new node(build(l,mid),build(mid+1,r));
  44. }
  45. point a[18],b[18];
  46. int _a,_b;
  47. il int Query(int l,int r,int k){
  48. while(l<r){
  49. int res=0;
  50. rep(i,1,_a)res+=a[i]->ls->data;
  51. rep(i,1,_b)res-=b[i]->ls->data;
  52. if(res>=k){
  53. rep(i,1,_a)a[i]=a[i]->ls;
  54. rep(i,1,_b)b[i]=b[i]->ls;
  55. r=mid;
  56. }else{
  57. rep(i,1,_a)a[i]=a[i]->rs;
  58. rep(i,1,_b)b[i]=b[i]->rs;
  59. l=mid+1,k-=res;
  60. }
  61. }return l;
  62. }
  63. il vd free(point i){if(i!=null)free(i->ls),free(i->rs),delete i;}
  64. il vd work(){
  65. int n=gi(),m=gi(),N=n;
  66. point root[maxn+maxm];
  67. int num[maxn],data[maxn+maxm];
  68. int A[maxm],B[maxm],K[maxm];
  69. char opt[3];
  70. rep(i,1,n)num[i]=data[i]=gi();
  71. rep(i,1,m){
  72. scanf("%s",opt);
  73. A[i]=gi(),B[i]=gi();
  74. if(opt[0]=='Q')K[i]=gi();
  75. else K[i]=-1,data[++N]=B[i];
  76. }
  77. sort(data+1,data+N+1);
  78. int tot=unique(data+1,data+N+1)-data-1;
  79. root[0]=build(1,tot);
  80. rep(i,1,n)num[i]=lower_bound(data+1,data+tot+1,num[i])-data,root[i]=root[i-1];
  81. rep(i,1,n)for(rg int j=i;j<=n;j+=lb(j))Updata(root[j],root[j],1,tot,num[i],1);
  82. rep(i,1,m){
  83. if(K[i]==-1){
  84. B[i]=lower_bound(data+1,data+tot+1,B[i])-data;
  85. for(rg int j=A[i];j<=n;j+=lb(j))Updata(root[j],root[j],1,tot,num[A[i]],-1);
  86. num[A[i]]=B[i];
  87. for(rg int j=A[i];j<=n;j+=lb(j))Updata(root[j],root[j],1,tot,num[A[i]],1);
  88. }else{
  89. _a=_b=0;
  90. for(rg int j=B[i];j;j-=lb(j))a[++_a]=root[j];
  91. for(rg int j=A[i]-1;j;j-=lb(j))b[++_b]=root[j];
  92. printf("%d\n",data[Query(1,tot,K[i])]);
  93. }
  94. }
  95. }
  96. int main(){
  97. freopen(Fname".in","r",stdin);
  98. freopen(Fname".out","w",stdout);
  99. int T=gi();
  100. null=new node;
  101. null->ls=null->rs=null;
  102. while(T--)work();
  103. return 0;
  104. }

bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)的更多相关文章

  1. [COGS257]动态排名系统 树状数组套主席树

    257. 动态排名系统 时间限制:5 s   内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...

  2. 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组

    [BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...

  3. zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap

    Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...

  4. 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树

    外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...

  5. ZOJ2112 Dynamic Rankings 动态区间第K最值 平方分割

    有了上一题的经验(POJ的静态区间第K最值)再解决这道题就轻松多了 空间5256KB,时间3330ms,如果把动态开点的平衡树换成数组模拟的话应该会更快 之所以选择了平方分割而不是树套树,不仅是所谓趁 ...

  6. 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题

    达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...

  7. bzoj1901:Zju2112 Dynamic Rankings

    思路:树套树,我写了两种,一种是线段树套splay,线段树维护区间信息,splay维护第k大,一种是树状数组套权值线段树(并不是什么可持久化线段树,只不过是动态开点罢了,为什么网上一大堆题解都是可持久 ...

  8. 【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 ...

  9. LuoguP2617 Dynamic Rankings (动态主席树学习理解)

    题目地址 题目链接 题解 动态主席树的板子题.动态主席树其实和静态的有很大差别,虽然同样是n个根,但是节点并不能共用,每个根节点表示bit上的一段区间. 所以其实是个树套树的东西来着,外层是bit,内 ...

随机推荐

  1. Java工具类(util) 之01- 数学运算工具(精确运算)

    数学运算工具(精确运算) /** * * @author maple * */ public abstract class AmountUtil { private AmountUtil() { } ...

  2. MyBatis(2)-全局配置文件

    本文的代码是在MyBatis(1)-简单入门基础之上进行学习的,如有不懂请先看此博文MyBatis(1)-简单入门! 1)配置文件的安装 --->在联网的情况下,点击去下载http://myba ...

  3. 解决Bug步骤

    1.看报错.将bug定位到文件.类.方法. 2.打断点.将bug定位到具体代码行号. 3.分析断点输出结果. 4.结合报错和断点结果,修改代码. 总之:拆解问题.定位问题.分析问题.解决问题.

  4. Ubuntu安装MySQL/MariaDB

    安装MariaDB/MySQL MariaDB是MySQL的分支,与MySQL高度兼容,几乎所有的命令都一样.MariaDB是由前MySQL的开发人员离开Sun公司后开发的,目的是为了防止Oracle ...

  5. PAT——1057. 数零壹

    给定一串长度不超过105的字符串,本题要求你将其中所有英文字母的序号(字母a-z对应序号1-26,不分大小写)相加,得到整数N,然后再分析一下N的二进制表示中有多少0.多少1.例如给定字符串“PAT ...

  6. ovs加dpdk出现EAL No free hugepages reported in hugepages-1048576kB

    问题 打开ovs的日志: cat /etc/local/var/log/openvswitch/ovs-vswichd.log 其中一条显示: 2018-07-30T02:12:05.443Z|000 ...

  7. uboot 移植 要点

    1.第一 首先要  学会 shell 语法   比如 变量的 概念 变量的使用 ,if 语法  ,以及简单 IF 语法(与 或预算),以及  while for 循环 等等语法,才能看得懂 uboot ...

  8. C++获取毫秒级时间戳

    #include<chrono>   auto timeNow = chrono::duration_cast<chrono::milliseconds>(chrono::sy ...

  9. 【OC底层】OC对象本质,如 isa, super-class

    Objective-C的本质 1.我们编写的Objective-C,底层现实都是C/C++,代码生成步骤如下:   2.在OC中的所有面向对象的实现,都是基于C/C++的数据结构实现的 3.将Obje ...

  10. Java多线程入门知识点梳理

    前言 在多核时代,高并发时代,对系统并行处理能力有很高要求.多线程就是这个时代最好的产物.通过使用多线程可以增强系统并行处理能力,提高CPU资源的有效利用:从而提高系统的处理能力.常见应用场景如:多窗 ...