bzoj2223 [Coci 2009]PATULJCI (主席树)
2223: [Coci 2009]PATULJCI
Time Limit: 10 Sec Memory Limit: 259 MB[Submit][Status][Discuss]
Description
HINT
输入第二个整数是序列中权值的范围Lim,即1<=ai(1<=i<=n)<=Lim,1<=Lim<=10000。
主席树模板dearu;
蒟蒻只能码板子了啊(摊);
↓代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #include<map> 10 #define N 300039 11 #define inf 0x3f3f3f3f 12 #define ll long long 13 using namespace std; 14 struct seg 15 { 16 int ls,rs,cnt; 17 }tree[N<<4]; 18 int val[N],tot,root[N]; 19 void build(int k,int l,int r) 20 { 21 tree[k].cnt=0; 22 if(l==r) 23 { 24 return; 25 } 26 int mid=(l+r)>>1; 27 build(tree[k].ls=++tot,l,mid); 28 build(tree[k].rs=++tot,mid+1,r); 29 } 30 void update(int las,int now,int l,int r,int v) 31 { 32 if(l==r) 33 { 34 tree[now].cnt=tree[las].cnt+1; 35 return; 36 } 37 int mid=(l+r)>>1; 38 if(mid>=v) 39 { 40 tree[now].rs=tree[las].rs; 41 update(tree[las].ls,tree[now].ls=++tot,l,mid,v); 42 } 43 else 44 { 45 tree[now].ls=tree[las].ls; 46 update(tree[las].rs,tree[now].rs=++tot,mid+1,r,v); 47 } 48 tree[now].cnt=tree[tree[now].ls].cnt+tree[tree[now].rs].cnt; 49 } 50 int query(int las,int now,int k,int l,int r) 51 { 52 if(l==r) 53 { 54 return l; 55 } 56 int mid=(l+r)>>1; 57 if(tree[tree[now].ls].cnt-tree[tree[las].ls].cnt>k) 58 { 59 return query(tree[las].ls,tree[now].ls,k,l,mid); 60 } 61 else if(tree[tree[now].rs].cnt-tree[tree[las].rs].cnt>k) 62 { 63 return query(tree[las].rs,tree[now].rs,k,mid+1,r); 64 } 65 else 66 { 67 return -1; 68 } 69 } 70 int main() 71 { 72 int n,m,lim,a,b,c; 73 scanf("%d%d",&n,&lim); 74 build(root[0]=++tot,1,lim); 75 for(a=1;a<=n;a++) 76 { 77 scanf("%d",&b); 78 update(root[a-1],root[a]=++tot,1,lim,b); 79 } 80 scanf("%d",&m); 81 while(m--) 82 { 83 scanf("%d%d",&a,&b); 84 c=query(root[a-1],root[b],(b-a+1)/2,1,lim); 85 if(c==-1) 86 { 87 printf("no\n"); 88 } 89 else 90 { 91 printf("yes %d\n",c); 92 } 93 } 94 return 0; 95 }
散りぬべき 時知りてこそ 世の中の 花も花なれ 人も人なれ