bzoj1901 Zju2112 Dynamic Rankings

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1901 Zju2112 Dynamic Rankings相关的知识,希望对你有一定的参考价值。

题目链接

BIT套主席树

第一次写,参考了一下hzwer的代码%%%Orz

跟主席树不同的就是查询和修改都像BIT一样,要修改log2n颗树的信息

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<string>
  7 #include<cmath>
  8 #include<ctime>
  9 #include<queue>
 10 #include<stack>
 11 #include<map>
 12 #include<set>
 13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
 14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
 15 #define Clear(a,b) memset(a,b,sizeof(a))
 16 #define inout(x) printf("%d",(x))
 17 #define douin(x) scanf("%lf",&x)
 18 #define strin(x) scanf("%s",(x))
 19 #define LLin(x) scanf("%lld",&x)
 20 #define op operator
 21 #define CSC main
 22 typedef unsigned long long ULL;
 23 typedef const int cint;
 24 typedef long long LL;
 25 using namespace std;
 26 void inin(int &ret)
 27 {
 28     ret=0;int f=0;char ch=getchar();
 29     while(ch<0||ch>9){if(ch==-)f=1;ch=getchar();}
 30     while(ch>=0&&ch<=9)ret*=10,ret+=ch-0,ch=getchar();
 31     ret=f?-ret:ret;
 32 }
 33 int n,m,ed,ch[3000010][2],sum[3000010],root[20020];
 34 inline int lowbit(int x){return x&-x;}
 35 int v[20020],num[20020],A[20020],B[20020],K[20020],top;
 36 int hash[20020],tot,ls[33],rs[33],a,b;
 37 int HASH(int x)
 38 {
 39     int l=1,r=tot,mid;
 40     while(l<=r){mid=(l+r)>>1;if(hash[mid]<x)l=mid+1;else r=mid-1;}
 41     return l;
 42 }
 43 void update(int last,int l,int r,int &y,int wei,int x)
 44 {
 45     y=++ed;
 46     sum[y]=sum[last]+x,ch[y][0]=ch[last][0],ch[y][1]=ch[last][1];
 47     if(l==r)return ;
 48     int mid=(l+r)>>1;
 49     if(wei<=mid)update(ch[last][0],l,mid,ch[y][0],wei,x);
 50     else update(ch[last][1],mid+1,r,ch[y][1],wei,x);
 51 }
 52 int query(int l,int r,int k)
 53 {
 54     if(l==r)return l;
 55     int sum1=0,sum2=0;
 56     re(i,1,a)sum1+=sum[ch[ls[i]][0]];
 57     re(i,1,b)sum2+=sum[ch[rs[i]][0]];
 58     int mid=(l+r)>>1;
 59     if(sum2-sum1>=k)
 60     {
 61         re(i,1,a)ls[i]=ch[ls[i]][0];
 62         re(i,1,b)rs[i]=ch[rs[i]][0];
 63         return query(l,mid,k);
 64     }
 65     else 
 66     {
 67         re(i,1,a)ls[i]=ch[ls[i]][1];
 68         re(i,1,b)rs[i]=ch[rs[i]][1];
 69         return query(mid+1,r,k+sum1-sum2);
 70     }
 71 }
 72 void add(int i,int x,int xx)
 73 {
 74     for(int j=i;j<=n;j+=lowbit(j))
 75         update(root[j],1,tot,root[j],x,xx);
 76 }
 77 int query(int i)
 78 {
 79     a=b=0;
 80     A[i]--;
 81     for(int j=A[i];j;j-=lowbit(j))ls[++a]=root[j];
 82     for(int j=B[i];j;j-=lowbit(j))rs[++b]=root[j];
 83     return hash[query(1,tot,K[i])];
 84 }
 85 int CSC()
 86 {
 87     char s[3];
 88     inin(n),inin(m);
 89     re(i,1,n)inin(v[i]),num[i]=v[i];
 90     top=n;
 91     re(i,1,m)
 92     {
 93         strin(s);
 94         inin(A[i]),inin(B[i]);
 95         if(s[0]==Q)inin(K[i]);
 96         else num[++top]=B[i];
 97     }
 98     sort(num,num+top+1);
 99     hash[++tot]=num[1];int wei;
100     re(i,2,top)if(num[i]!=num[i-1])hash[++tot]=num[i];
101     re(i,1,n)wei=HASH(v[i]),add(i,wei,1);
102     re(i,1,m)if(K[i])printf("%d\n",query(i));
103     else 
104     {
105         wei=HASH(v[A[i]]);
106         add(A[i],wei,-1);
107         v[A[i]]=B[i];
108         wei=HASH(B[i]);
109         add(A[i],wei,1);
110     }
111     return 0;
112 }

 

以上是关于bzoj1901 Zju2112 Dynamic Rankings的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ1901]Zju2112 Dynamic Rankings

[BZOJ1901]Zju2112 Dynamic Rankings

bzoj1901: Zju2112 Dynamic Rankings

bzoj1901 Zju2112 Dynamic Rankings

Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap

bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希