標籤:
可持久化線段樹
同BZOJ 3524,但是不要像我一樣直接貼代碼……TAT白白WA了一次,so sad
1 /************************************************************** 2 Problem: 2223 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:804 ms 7 Memory:73932 kb 8 ****************************************************************/ 9 10 //BZOJ 222311 #include<cmath>12 #include<vector>13 #include<cstdio>14 #include<cstring>15 #include<cstdlib>16 #include<iostream>17 #include<algorithm>18 #define rep(i,n) for(int i=0;i<n;++i)19 #define F(i,j,n) for(int i=j;i<=n;++i)20 #define D(i,j,n) for(int i=j;i>=n;--i)21 #define pb push_back22 #define CC(a,b) memset(a,b,sizeof(a))23 using namespace std;24 int getint(){25 int v=0,sign=1; char ch=getchar();26 while(!isdigit(ch)) {if(ch==‘-‘) sign=-1; ch=getchar();}27 while(isdigit(ch)) {v=v*10+ch-‘0‘; ch=getchar();}28 return v*sign;29 }30 const int N=300010,INF=~0u>>2;31 const double eps=1e-8;32 /*******************template********************/33 int n,m,Lim,a[N];34 35 struct Tree{36 int cnt,l,r;37 }t[N*20];38 int root[N],cnt;39 #define mid (l+r>>1)40 void update(int &o,int l,int r,int pos){41 t[++cnt]=t[o]; o=cnt; ++t[o].cnt;42 if (l==r) return;43 if (pos<=mid) update(t[o].l,l,mid,pos);44 else update(t[o].r,mid+1,r,pos);45 }46 int query(int i,int j,int num){47 i=root[i],j=root[j];48 int l=1,r=Lim;49 while(l!=r){50 if(t[t[j].l].cnt-t[t[i].l].cnt>num)51 r=mid,j=t[j].l,i=t[i].l;52 else if(t[t[j].r].cnt-t[t[i].r].cnt>num)53 l=mid+1,j=t[j].r,i=t[i].r;54 else return 0;55 }56 return l;57 }58 #undef mid59 int main(){60 #ifndef ONLINE_JUDGE61 freopen("input.txt","r",stdin);62 // freopen("output.txt","w",stdout);63 #endif64 n=getint(); Lim=getint();65 F(i,1,n) a[i]=getint();66 F(i,1,n){67 root[i]=root[i-1];68 update(root[i],1,Lim,a[i]);69 }70 m=getint();71 F(i,1,m){72 int l=getint(),r=getint();73 int ans=query(l-1,r,(r-l+1)>>1);74 if (ans) printf("yes %d\n",ans);75 else puts("no");76 }77 return 0;78 }View Code
【BZOJ】【2223】【COCI 2009】PATULJCI