Mn Zn线段树分裂WA10pts只对了#12求调
查看原帖
Mn Zn线段树分裂WA10pts只对了#12求调
444040
Echoternity楼主2022/9/2 17:42

球球了qwq

const int MAXN=1e6+10;
int N,Q;
struct SegmentTree
{
    int Rt[MAXN],Idx=0,Coll=1;
    struct ST
    {
        int lc,rc;
        int val;
    }Tr[MAXN<<5];
    int merge(int p1,int p2,int l,int r)
    {
        if(!p1||!p2) return p1|p2;
        Tr[p1].val+=Tr[p2].val;
        if(l==r) return p1;
        int mid=(l+r)>>1;
        Tr[p1].lc=merge(Tr[p1].lc,Tr[p2].lc,l,mid),
        Tr[p1].rc=merge(Tr[p1].rc,Tr[p2].rc,mid+1,r);
        return p1;
    }
    void split(int p1,int &p2,int k)
    {
        if(!p1) return ;
        p2=++Idx;
        int v=Tr[Tr[p1].lc].val;
        if(v<k) split(Tr[p1].rc,Tr[p2].rc,k-v);
        else std::swap(Tr[p1].rc,Tr[p2].rc);
        if(v>k) split(Tr[p1].lc,Tr[p2].lc,k);
        Tr[p2].val=Tr[p1].val-k,Tr[p1].val=k;
    }
    void modifyX(int &p,int l,int r,int v,int k)
    {
        if(!p) p=++Idx;
        Tr[p].val+=k;
        if(l==r) return ;
        int mid=(l+r)>>1;
        if(v<=mid) modifyX(Tr[p].lc,l,mid,v,k);
        else modifyX(Tr[p].rc,mid+1,r,v,k);
    }
    int queryCnt(int p,int l,int r,int ql,int qr)
    {
        if(!p) return 0ll;
        if(ql<=l&&r<=qr) return Tr[p].val;
        int mid=(l+r)>>1;
        int res=0;
        if(ql<=mid) res+=queryCnt(Tr[p].lc,l,mid,ql,qr);
        if(mid<qr) res+=queryCnt(Tr[p].rc,mid+1,r,ql,qr);
        return res;
    }
    int queryKth(int p,int l,int r,int k)
    {
        if(l==r) return l;
        int mid=(l+r)>>1;
        if(Tr[Tr[p].lc].val>=k) return queryKth(Tr[p].lc,l,mid,k);
        else return queryKth(Tr[p].rc,mid+1,r,k-Tr[Tr[p].lc].val);
    }
    inline void move()
    {
        int p,x,y;read(p,x,y);
        int q1=queryCnt(Rt[p],1,N,1,y),q2=queryCnt(Rt[p],1,N,x,y);
        split(Rt[p],Rt[++Coll],q1-q2);
        split(Rt[Coll],Rt[0],q2);
        Rt[x]=merge(Rt[x],Rt[0],1,N);
    }
    inline void merge()
    {
        int p,t;read(p,t);
        Rt[p]=merge(Rt[p],Rt[t],1,N);
    }
    inline void modifyX()
    {
        int x,p;int q;
        read(p,x,q);
        modifyX(Rt[p],1,N,q,x);
    }
    inline int queryCnt()
    {
        int p,x,y;read(p,x,y);
        return queryCnt(Rt[p],1,N,x,y);
    }
    inline int queryKth()
    {
        int p;int k;
        read(p,k);
        int cnt=queryCnt(Rt[p],1,N,1,N);
        if(cnt<k) return -1;
        return queryKth(Rt[p],1,N,k);
    }
    inline void insert(int x,int v)
    {
        modifyX(Rt[1],1,N,x,v);
    }
}Tree;
signed main()
{
    freopen("P5494_1.in","r",stdin);
    freopen("P5494.out","w",stdout);
    read(N,Q);
    for(int i=1,x;i<=N;++i) read(x),Tree.insert(i,x);
    for(int opt;Q--;)
    {
        read(opt);
        switch(opt)
        {
            case 0:Tree.move();break;
            case 1:Tree.merge();break;
            case 2:Tree.modifyX();break;
            case 3:write(Tree.queryCnt(),'\n');break;
            case 4:write(Tree.queryKth(),'\n');break;
        }
    }
    return 0;
}

真 Mn Zn ,码风有些清奇,谢谢各位巨佬惹

2022/9/2 17:42
加载中...