1. 程式人生 > >bzoj 3524 [POI2014]KUR-Couriers (主席樹)

bzoj 3524 [POI2014]KUR-Couriers (主席樹)

getch return for sca print main code truct include

題目大意:給你一個序列,求某個區間出現次數大於一半的數是什麽

主席樹裸題,刷刷水題提升自信= =

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define ll long long 
 5 #define il inline
 6 #define N 500100
 7 using namespace std;
 8 //re
 9 int n,m,tot;
10 int a[N],root[N];
11 struct Seg{
12     int ls,rs,sum;
13 }seg[N*30]; 14 15 int gc() 16 { 17 int rett=0,fh=1;char p=getchar(); 18 while(p<0||p>9){if(p==-)fh=-1;p=getchar();} 19 while(p>=0&&p<=9){rett=(rett<<3)+(rett<<1)+p-0;p=getchar();} 20 return rett*fh; 21 } 22 il void pushup(int rt){seg[rt].sum=seg[seg[rt].ls].sum+seg[seg[rt].rs].sum;}
23 void build(int l,int r,int rt) 24 { 25 if(l==r) return; 26 int mid=(l+r)>>1; 27 seg[rt].ls=++tot,build(l,mid,tot); 28 seg[rt].rs=++tot,build(mid+1,r,tot); 29 } 30 void update(int x,int l,int r,int rt1,int rt2,int val) 31 { 32 if(l==r) {seg[rt2].sum+=val;return;} 33 int
mid=(l+r)>>1; 34 if(x<=mid){ 35 if(!seg[rt2].ls||seg[rt2].ls==seg[rt1].ls){ 36 seg[rt2].ls=++tot,seg[seg[rt2].ls].sum=seg[seg[rt1].ls].sum; 37 if(!seg[rt2].rs) seg[rt2].rs=seg[rt1].rs; 38 }update(x,l,mid,seg[rt1].ls,seg[rt2].ls,val); 39 }else{ 40 if(!seg[rt2].rs||seg[rt2].rs==seg[rt1].rs){ 41 seg[rt2].rs=++tot,seg[seg[rt2].rs].sum=seg[seg[rt1].rs].sum; 42 if(!seg[rt2].ls) seg[rt2].ls=seg[rt1].ls; 43 }update(x,mid+1,r,seg[rt1].rs,seg[rt2].rs,val); 44 }pushup(rt2); 45 } 46 int query(int l,int r,int rt1,int rt2,int len) 47 { 48 if(l==r) return l; 49 int mid=(l+r)>>1; 50 if(seg[seg[rt2].ls].sum-seg[seg[rt1].ls].sum>=len) 51 return query(l,mid,seg[rt1].ls,seg[rt2].ls,len); 52 if(seg[seg[rt2].rs].sum-seg[seg[rt1].rs].sum>=len) 53 return query(mid+1,r,seg[rt1].rs,seg[rt2].rs,len); 54 return 0; 55 } 56 57 int main() 58 { 59 //freopen("data.in","r",stdin); 60 scanf("%d%d",&n,&m); 61 for(int i=1;i<=n;i++) a[i]=gc(); 62 root[0]=++tot,build(1,n,tot); 63 for(int i=1;i<=n;i++) 64 root[i]=++tot,update(a[i],1,n,root[i-1],root[i],1); 65 int x,y; 66 while(m--) 67 { 68 x=gc(),y=gc(); 69 printf("%d\n",query(1,n,root[x-1],root[y],(y-x+1)/2+1)); 70 } 71 return 0; 72 }

bzoj 3524 [POI2014]KUR-Couriers (主席樹)