萌新求助按秩合并灵异事件
查看原帖
萌新求助按秩合并灵异事件
150467
never_turn_right楼主2021/7/5 21:26

rt 为什么我把深度大的合并到深度小的就会ac 把深度小的合并的深度大的就会t ac片段

if(opt==1)
    {
      cin>>a>>b;
      int fax=findfa(a,i-1);
      int fay=findfa(b,i-1);
      int dpx=st.ask_dp(st.root[i-1],1,n,fax);
      int dpy=st.ask_dp(st.root[i-1],1,n,fay);
      if(dpx<dpy)
        st.root[i]=st.change(st.root[i-1],1,n,fay,fax);
      else if(dpx!=dpy)
        st.root[i]=st.change(st.root[i-1],1,n,fax,fay);
      else
        st.root[i]=st.change(st.root[i-1],1,n,fax,fay),
        st.root[i]=st.change_s(st.root[i],1,n,fay);
    }

tle片段

if(opt==1)
    {
      cin>>a>>b;
      int fax=findfa(a,i-1);
      int fay=findfa(b,i-1);
      int dpx=st.ask_dp(st.root[i-1],1,n,fax);
      int dpy=st.ask_dp(st.root[i-1],1,n,fay);
      if(dpx>dpy)
        st.root[i]=st.change(st.root[i-1],1,n,fay,fax);
      else if(dpx!=dpy)
        st.root[i]=st.change(st.root[i-1],1,n,fax,fay);
      else
        st.root[i]=st.change(st.root[i-1],1,n,fax,fay),
        st.root[i]=st.change_s(st.root[i],1,n,fay);
    }

完整代码

#include<bits/stdc++.h>
using namespace std;
#define N 400005
int n,m;
int a[N];
int nxtk;
struct setshit
{
  int tot=0;
  struct node 
  {
    int son[2];
    int val;
    int dep;
  }tr[N<<5];
  int root[N];
  int change(int x,int l,int r,int k,int v)
  {
    int rtt=++tot;
    tr[rtt]=tr[x];
    if(l==r)
    {
      tr[rtt].val=v;
      return rtt;
    } 
    int mid=(l+r)>>1;
    if(k<=mid)
      tr[rtt].son[0]=change(tr[x].son[0],l,mid,k,v);
    else
      tr[rtt].son[1]=change(tr[x].son[1],mid+1,r,k,v);
    return rtt;
  }
  int change_s(int x,int l,int r,int k)
  {
    int rtt=++tot;
    tr[rtt]=tr[x];
    if(l==r)
    {
      tr[rtt].dep++;
      return rtt;
    } 
    int mid=(l+r)>>1;
    if(k<=mid)
      tr[rtt].son[0]=change_s(tr[x].son[0],l,mid,k);
    else
      tr[rtt].son[1]=change_s(tr[x].son[1],mid+1,r,k);
    return rtt;
  }
  int ask(int x,int l,int r,int k)
  {
    if(l==r)
      return tr[x].val;
    int mid=(l+r)>>1;
    if(k<=mid)
      return ask(tr[x].son[0],l,mid,k);
    if(mid<k)
      return ask(tr[x].son[1],mid+1,r,k);
  }
  int ask_dp(int x,int l,int r,int k)
  {
    if(l==r)
      return tr[x].dep;
    int mid=(l+r)>>1;
    if(k<=mid)
      return ask(tr[x].son[0],l,mid,k);
    if(mid<k)
      return ask(tr[x].son[1],mid+1,r,k);
  }
  int build(int l,int r)
  {
    int rtt=++tot;
    if(l==r)
    {
      tr[rtt].val=a[l];
      tr[rtt].dep=1;
      return rtt;
    }                             
    int mid=(l+r)>>1;                                         
    tr[rtt].son[0]=build(l,mid);
    tr[rtt].son[1]=build(mid+1,r);
    return rtt;
  }
}st;
int nowk=0;
int findfa(int x,int kt)
{
  int fa=st.ask(st.root[kt],1,n,x);
  if(fa==x)
    return x;
  else
    return findfa(fa,kt);
}
int main()
{
  ios::sync_with_stdio(0);
  cin>>n>>m;
  for(int i=1;i<=n;i++)
    a[i]=i;
  st.root[0]=st.build(1,n);
  for(int i=1;i<=m;i++)
  {
    nxtk=i;
    int opt,a,b;
    cin>>opt;
    if(opt==2)
    {
      cin>>a;
      st.root[i]=st.root[a];
    }
    if(opt==1)
    {
      cin>>a>>b;
      int fax=findfa(a,i-1);
      int fay=findfa(b,i-1);
      int dpx=st.ask_dp(st.root[i-1],1,n,fax);
      int dpy=st.ask_dp(st.root[i-1],1,n,fay);
      if(dpx<dpy)
        st.root[i]=st.change(st.root[i-1],1,n,fay,fax);
      else if(dpx!=dpy)
        st.root[i]=st.change(st.root[i-1],1,n,fax,fay);
      else
        st.root[i]=st.change(st.root[i-1],1,n,fax,fay),
        st.root[i]=st.change_s(st.root[i],1,n,fay);
    }
    if(opt==3)
    {
      cin>>a>>b;
      if(findfa(a,i-1)==findfa(b,i-1))
        cout<<1<<endl;
      else
        cout<<0<<endl;
      st.root[i]=st.root[i-1];
    }
  }
  return 0;
}
2021/7/5 21:26
加载中...