其他分享
首页 > 其他分享> > 洛谷 P3293 [SCOI2016]美味(主席树)

洛谷 P3293 [SCOI2016]美味(主席树)

作者:互联网

 

 

const int N=2e5+5;

    int n,m;
    int i,j,k;
    int a[N];
    struct Node
    {
        int l,r;
        int sz;
    }t[N<<5];
    int root[N],tot=0;

void update(int &x,int y,int l,int r,int pos)
{
    x=++tot;
    t[x]=t[y];
    t[x].sz++;
    if(l==r) return ;
    else{
        int mid=l+r>>1;
        if(mid>=pos) update(t[x].l,t[y].l,l,mid,pos);
        else update(t[x].r,t[y].r,mid+1,r,pos);
    }
}

int query(int x,int y,int L,int R,int l,int r)
{
    if(l>R || L>r) return 0;
    if(L>=l && r>=R) return t[y].sz-t[x].sz;
    else{
        int mid=L+R>>1;
        int ans=0;
        if(mid>=l) ans+=query(t[x].l,t[y].l,L,mid,l,r);
        if(r>=mid+1) ans+=query(t[x].r,t[y].r,mid+1,R,l,r);
        return ans;
    }
}

int main()
{
    while(~sdd(n,m)){
        for(int i=1;i<=n;i++) sd(a[i]);
        for(int i=1;i<=n;i++) update(root[i],root[i-1],0,1e5,a[i]);
        for(int i=1;i<=m;i++){
            int b,x,l,r;
            sdd(b,x); sdd(l,r);
            int ans=0;
            for(int j=20;j>=0;j--){
                int id=(1<<j)&b?1:0;
                //dbg(ans-x);
                //dbg(ans+(1<<j)-1-x);
                if(id && !query(root[l-1],root[r],0,1e5,ans-x,ans+(1<<j)-1-x)) //1找0
                    ans+=(1<<j);
                if(!id && query(root[l-1],root[r],0,1e5,ans+(1<<j)-x,ans+(1<<j+1)-1-x))
                    ans+=(1<<j);
            }
            pd(ans^b);
        }
    }
    //PAUSE;
    return 0;
}

 

标签:洛谷,int,mid,P3293,pos,return,query,ans,SCOI2016
来源: https://blog.csdn.net/C_Dreamy/article/details/116136362