社区讨论

WA ON SUB1 求调

P3224[HNOI2012] 永无乡参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhjs5a0h
此快照首次捕获于
2025/11/04 07:37
4 个月前
此快照最后确认于
2025/11/04 07:37
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=5e5+100;
//原本的大小是1e5,但是有插入,所以要加上m的大小

int n,m;

struct Splay{
    struct NODE{
        int s[2],p,v,id;
        int size;

        void init(int _v,int _id,int _p)
        {
            v=_v,id=_id,p=_p;
            size=1;
        }
    }tr[N];

    int root[N],idx;

    void pushup(int x)
    {
        tr[x].size=tr[tr[x].s[0]].size+tr[tr[x].s[1]].size+1;
    }

    void rotate(int x)
    {
        int y=tr[x].p,z=tr[y].p;
        int k=tr[y].s[1]==x;
        tr[z].s[tr[z].s[1]==y]=x,tr[x].p=z;
        tr[y].s[k]=tr[x].s[k^1],tr[tr[x].s[k^1]].p=y;
        tr[x].s[k^1]=y,tr[y].p=x;
        pushup(y),pushup(x);
    }

    void splay(int x,int k,int b)
    {
        while(tr[x].p!=k)
        {
            int y=tr[x].p,z=tr[y].p;
            if(z!=k)
                if((tr[y].s[1]==x)^(tr[z].s[1]==y)) rotate(x);
                else    rotate(y);
            rotate(x);
        }
        if(!k)  root[b]=x;
    }

    void insert(int v,int id,int b)
    {
        int u=root[b],p=0;
        while(u) p=u,u=tr[u].s[v>tr[u].v];
        u=++idx;
        if(p)   tr[p].s[v>tr[p].v]=u;
        tr[u].init(v,id,p);
        splay(u,0,b);
    }

    int get_k(int k,int b)
    {
        int u=root[b];
        while(u)
        {
            if(tr[tr[u].s[0]].size>=k)  u=tr[u].s[0];
            else if(tr[tr[u].s[0]].size+1==k)
                return splay(u,0,b),tr[u].id;
            else k-=tr[tr[u].s[0]].size+1,u=tr[u].s[1];
        }
        return -1;
    }

    void merge(int u,int b)
    {
        if(tr[u].s[0])  merge(tr[u].s[0],b);
        if(tr[u].s[1])  merge(tr[u].s[1],b);
        insert(tr[u].v,tr[u].id,b);
    }
}Tr;

int f[N];
int find(int x)
{
    if(f[x]!=x) f[x]=find(f[x]);
    return f[x];
}

signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        f[i]=Tr.root[i]=i;
        int v;
        cin>>v;
        Tr.tr[i].init(v,i,0);
    }
    Tr.idx=n;
    while(m--)
    {
        int a,b;
        cin>>a>>b;
        a=find(a),b=find(b);
        if(a!=b)
        {
            if(Tr.tr[Tr.root[a]].size>Tr.tr[Tr.root[b]].size) swap(a,b);
            Tr.merge(Tr.root[a],b);
            f[a]=b;
        }
    }

    cin>>m;
    while(m--)
    {
        char op;
        int a,b;
        cin>>op>>a>>b;
        if(op=='B')
        {
            a=find(a),b=find(b);
            if(a!=b)
            {
                if(Tr.tr[Tr.root[a]].size>Tr.tr[Tr.root[b]].size)    swap(a,b);
                Tr.merge(Tr.root[a],b);
                f[a]=b;
            }
        }
        else
        {
            a=find(a);
            if(Tr.tr[Tr.root[a]].size<b)    cout<<-1<<endl;
            else    cout<<Tr.get_k(b,a)<<endl;
        }
    }

    return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...