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

时间:2023-03-09 18:21:56
bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI

题目链接1 题目链接2

主席树模板题

两题有细节不同

 #include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
#define re(i,l,r) for(int i=(l);i<=(r);i++)
#define Clear(a,b) memset(a,b,sizeof(a))
#define inout(x) printf("%d",(x))
#define douin(x) scanf("%lf",&x)
#define strin(x) scanf("%s",(x))
#define LLin(x) scanf("%lld",&x)
#define op operator
#define CSC main
typedef unsigned long long ULL;
typedef const int cint;
typedef long long LL;
using namespace std;
void inin(int &ret)
{
ret=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
while(ch>=''&&ch<='')ret*=,ret+=ch-'',ch=getchar();
ret=f?-ret:ret;
}
int root[],l[],r[],sum[];
int n,m,ed;
void update(int ll,int rr,int x,int &y,int xx)
{
y=++ed,sum[y]=sum[x]+;
if(ll==rr)return ;
l[y]=l[x],r[y]=r[x];
int mid=(ll+rr)>>;
if(xx<=mid)update(ll,mid,l[x],l[y],xx);
else update(mid+,rr,r[x],r[y],xx);
}
int query(int L,int R)
{
int ll=,rr=n,mid,x=root[L-],y=root[R],temp=(R-L+)>>;
while(ll<rr)
{
if(sum[y]-sum[x]<=temp)return ;mid=(ll+rr)>>;
if(sum[l[y]]-sum[l[x]]>temp)rr=mid,x=l[x],y=l[y];
else if(sum[r[y]]-sum[r[x]]>temp)ll=mid+,x=r[x],y=r[y];
else return ;
}
return ll;
}
int CSC()
{
inin(n),inin(m);
re(i,,n)
{
int x;inin(x);
update(,n,root[i-],root[i],x);
}
re(i,,m)
{
int ll,rr;inin(ll),inin(rr);
printf("%d\n",query(ll,rr));
}
return ;
}

bzoj3524

 #include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
#define re(i,l,r) for(int i=(l);i<=(r);i++)
#define Clear(a,b) memset(a,b,sizeof(a))
#define inout(x) printf("%d",(x))
#define douin(x) scanf("%lf",&x)
#define strin(x) scanf("%s",(x))
#define LLin(x) scanf("%lld",&x)
#define op operator
#define CSC main
typedef unsigned long long ULL;
typedef const int cint;
typedef long long LL;
using namespace std;
void inin(int &ret)
{
ret=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
while(ch>=''&&ch<='')ret*=,ret+=ch-'',ch=getchar();
ret=f?-ret:ret;
}
int root[],l[],r[],sum[];
int n,m,ed;
void update(int ll,int rr,int x,int &y,int xx)
{
y=++ed,sum[y]=sum[x]+;
if(ll==rr)return ;
l[y]=l[x],r[y]=r[x];
int mid=(ll+rr)>>;
if(xx<=mid)update(ll,mid,l[x],l[y],xx);
else update(mid+,rr,r[x],r[y],xx);
}int lim;
int query(int L,int R)
{
if(L>R)swap(L,R);
int ll=,rr=lim,mid,x=root[L-],y=root[R],temp=(R-L+)>>;
while(ll!=rr)
{
if(sum[y]-sum[x]<=temp)return ;mid=(ll+rr)>>;
if(sum[l[y]]-sum[l[x]]>temp)rr=mid,x=l[x],y=l[y];
else if(sum[r[y]]-sum[r[x]]>temp)ll=mid+,x=r[x],y=r[y];
else return ;
}
return ll;
}
int CSC()
{
inin(n),inin(lim);
re(i,,n)
{
int x;inin(x);
update(,lim,root[i-],root[i],x);
}inin(m);
re(i,,m)
{
int ll,rr;inin(ll),inin(rr);
int ans=query(ll,rr);if(ans)cout<<"yes ";else cout<<"no\n";
if(ans)printf("%d\n",ans);
}
return ;
}

bzoj2223