bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI

题目链接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 }
bzoj3524
 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 }
bzoj2223

 

posted @ 2016-02-02 11:03  HugeGun  阅读(278)  评论(0编辑  收藏  举报