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