[POI2014]Couriers

link

熟悉熟悉模板,其实就是主席树的板子,最后卡一卡空间即可

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
const int N=500001;
int n,tmp[N],cnt,a[N],q,tr[N],ls[N*20],rs[N*20],sum[N*20];
void build(int &rt,int l,int r){
    rt=++cnt;
    if(l==r) return;
    int mid=l+r>>1;
    build(ls[rt],l,mid),build(rs[rt],mid+1,r);
    return;
}
void update(int &rt,int lst,int l,int r,int x){
    rt=++cnt;ls[rt]=ls[lst],rs[rt]=rs[lst],sum[rt]=sum[lst]+1;
    if(l==r) return;
    int mid=l+r>>1;
    if(x<=mid) update(ls[rt],ls[lst],l,mid,x);
    else update(rs[rt],rs[lst],mid+1,r,x);
}
int ql,qr;
int map[N],scc,pos[N],ST[N];
int query(int L,int R,int l,int r){
    if(l==r){
        bool judge=(sum[R]-sum[L])*2>(qr-ql+1);
        if(!judge) return 0;
        return ST[l];
    }
    int mid=l+r>>1;
    int sl=sum[ls[R]]-sum[ls[L]],sr=sum[rs[R]]-sum[rs[L]];
    if(sl>sr) return query(ls[L],ls[R],l,mid);
    if(sl<sr) return query(rs[L],rs[R],mid+1,r);
    return 0;
}
int main(){
    n=read(),q=read();
    for(int i=1;i<=n;i++) a[i]=tmp[i]=read();
    sort(tmp+1,tmp+n+1);
    int d=unique(tmp+1,tmp+n+1)-(tmp+1);
    for(int i=1;i<=n;i++)
        if(!map[tmp[i]]) map[tmp[i]]=++scc,ST[scc]=tmp[i];
    for(int i=1;i<=n;i++) a[i]=map[tmp[lower_bound(tmp+1,tmp+n+1,a[i])-tmp]];
    build(tr[0],1,d);
    for(int i=1;i<=n;i++) update(tr[i],tr[i-1],1,d,a[i]);
    while(q--){
        ql=read(),qr=read();
        printf("%d\n",query(tr[ql-1],tr[qr],1,d));
    }
}
View Code

 

posted @ 2018-12-12 20:01  siruiyang_sry  阅读(155)  评论(0编辑  收藏  举报