题目链接1 题目链接2
主席树模板题
两题有细节不同
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 root[500050],l[10000010],r[10000010],sum[10000010]; 34 int n,m,ed; 35 void update(int ll,int rr,int x,int &y,int xx) 36 { 37 y=++ed,sum[y]=sum[x]+1; 38 if(ll==rr)return ; 39 l[y]=l[x],r[y]=r[x]; 40 int mid=(ll+rr)>>1; 41 if(xx<=mid)update(ll,mid,l[x],l[y],xx); 42 else update(mid+1,rr,r[x],r[y],xx); 43 } 44 int query(int L,int R) 45 { 46 int ll=1,rr=n,mid,x=root[L-1],y=root[R],temp=(R-L+1)>>1; 47 while(ll<rr) 48 { 49 if(sum[y]-sum[x]<=temp)return 0;mid=(ll+rr)>>1; 50 if(sum[l[y]]-sum[l[x]]>temp)rr=mid,x=l[x],y=l[y]; 51 else if(sum[r[y]]-sum[r[x]]>temp)ll=mid+1,x=r[x],y=r[y]; 52 else return 0; 53 } 54 return ll; 55 } 56 int CSC() 57 { 58 inin(n),inin(m); 59 re(i,1,n) 60 { 61 int x;inin(x); 62 update(1,n,root[i-1],root[i],x); 63 } 64 re(i,1,m) 65 { 66 int ll,rr;inin(ll),inin(rr); 67 printf("%d\n",query(ll,rr)); 68 } 69 return 0; 70 }
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 root[500050],l[10000010],r[10000010],sum[10000010]; 34 int n,m,ed; 35 void update(int ll,int rr,int x,int &y,int xx) 36 { 37 y=++ed,sum[y]=sum[x]+1; 38 if(ll==rr)return ; 39 l[y]=l[x],r[y]=r[x]; 40 int mid=(ll+rr)>>1; 41 if(xx<=mid)update(ll,mid,l[x],l[y],xx); 42 else update(mid+1,rr,r[x],r[y],xx); 43 }int lim; 44 int query(int L,int R) 45 { 46 if(L>R)swap(L,R); 47 int ll=1,rr=lim,mid,x=root[L-1],y=root[R],temp=(R-L+1)>>1; 48 while(ll!=rr) 49 { 50 if(sum[y]-sum[x]<=temp)return 0;mid=(ll+rr)>>1; 51 if(sum[l[y]]-sum[l[x]]>temp)rr=mid,x=l[x],y=l[y]; 52 else if(sum[r[y]]-sum[r[x]]>temp)ll=mid+1,x=r[x],y=r[y]; 53 else return 0; 54 } 55 return ll; 56 } 57 int CSC() 58 { 59 inin(n),inin(lim); 60 re(i,1,n) 61 { 62 int x;inin(x); 63 update(1,lim,root[i-1],root[i],x); 64 }inin(m); 65 re(i,1,m) 66 { 67 int ll,rr;inin(ll),inin(rr); 68 int ans=query(ll,rr);if(ans)cout<<"yes ";else cout<<"no\n"; 69 if(ans)printf("%d\n",ans); 70 } 71 return 0; 72 }