求助主席树打挂了
查看原帖
求助主席树打挂了
151647
sycqwq楼主2022/2/9 15:17

rt主席树挂了

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=3e5+5;
    struct node
    {
        int l,r,x;
    }a[maxn<<6];
    int n,b[maxn],t[maxn],rt[maxn],tot,lst[maxn],q;
    int newnode(int rt)
    {
        ++tot;
        a[tot]=a[rt];
        return tot;
    }
    int update(int l,int r,int rt,int x,int y)
    {
        rt=newnode(rt);
        ++a[rt].x;
        if(l==r)
        {
            return rt;
        }
        int mid=l+r>>1;
        if(x<=mid)
            a[rt].l=update(l,mid,a[rt].l,x,y);
        else
            a[rt].r=update(mid+1,r,a[rt].r,x,y); 
        return rt;
    }  
    int query(int l,int r,int lrt,int rrt,int x,int y)
    {
        // cerr<<l<<' '<<r<<' '<<a[rt].x<<' '<<rt<<endl;
        if(l==r)
            return a[rrt].x-a[lrt].x;
        int s=0,mid=l+r>>1;
        if(mid<x)
        {
            s+=a[a[rrt].l].x-a[a[lrt].l].x;
            s+=query(mid+1,r,a[lrt].r,a[rrt].r,x,y);
            return s;
        }       
        return query(l,mid,a[lrt].l,a[rrt].l,x,y);
    }
    int nxt[maxn];
    void subtask3init()
    {   
        for(int i=1;i<=n;i++)
        {
            // cerr<<b[i]<<' ';
            t[i]=b[i];
        }
        // cout<<endl;
        sort(b+1,b+n+1);
        int tn=unique(b+1,b+n+1)-b-1;
        for(int i=1;i<=n;i++)
            t[i]=lower_bound(b+1,b+tn+1,t[i])-b; 
        
        for(int i=1;i<=n;i++)
        {
            rt[i]=update(0,n,rt[i-1],lst[t[i]],1);
            lst[t[i]]=i; 
        }
    }
    int read()
    {
        char c=getchar();
        int f=0,d=0;
        while(!isdigit(c))
            f|=c=='-',c=getchar();
        while(isdigit(c))
            d=d*10+(c^48),c=getchar();
        return f?-d:d;
    }
    int Query(int a,int b,int c,int d,int e,int f)
    {
        // Do something...
        // subtask3(); 
        int s=0;
        int l=a,r=b;
        while(l<=r)
        {
            int mid=l+r>>1;
            if(query(0,n,rt[mid-1],rt[d],mid,d)-query(0,n,rt[mid-1],rt[c],mid,c)+1>=e)
                r=mid-1;
            else
                l=mid+1;
        }
        int tl=a,tr=b;
        while(tl<=tr)
        {
            int mid=tl+tr>>1;
            if(query(0,n,rt[mid-1],rt[d],mid,d)-query(0,n,rt[mid-1],rt[c],mid,c)+1<=f)
                tl=mid+1;
            else
                tr=mid-1;
        }

        // for(int i=a;i<=b;i++)
        // { 
        //     int x=query(1,n,rt[d],i,d),y=query(1,n,rt[c],i,c);
        //     if(e<=x-y+1&&x-y+1<=f)
        //         ++s;  
        // }
        return tr-l+1;
    }
    void Init()
    {
        // Do something...
        cin>>n>>q;
        for(int i=1;i<=n;i++)
            // cin>>b[i];
            b[i]=read();
        subtask3init();
    }
    void print(int x)
    {
        if(x>=10)
            print(x/10);
        putchar(x%10+'0');
    }
    int main()
    {
        Init();
        int lstans=0;
        for(int i=1;i<=q;i++)
        {
            int a[5],e,f;
            a[1]=read(),a[2]=read(),a[3]=read(),a[4]=read(),e=read(),f=read();
            a[1]=(a[1]+lstans)%n+1;
            a[2]=(a[2]+lstans)%n+1;
            a[3]=(a[3]+lstans)%n+1;
            a[4]=(a[4]+lstans)%n+1;
            sort(a+1,a+5);
            lstans=Query(a[1],a[2],a[3],a[4],e,f);
            print(lstans);
            puts("");
        }  
        return 0;
    }
2022/2/9 15:17
加载中...