【BZOJ】【2223】【COCI 2009】PATULJCI

可持久化线段树


  同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 2223
11 #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_back
22 #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 mid
59 int main(){
60 #ifndef ONLINE_JUDGE
61     freopen("input.txt","r",stdin);
62 //    freopen("output.txt","w",stdout);
63 #endif
64     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
",ans);
75         else puts("no");
76     }
77     return 0;
78 }
View Code
原文地址:https://www.cnblogs.com/Tunix/p/4340967.html