LCT求调,op=0,x=y的情况下T了
查看原帖
LCT求调,op=0,x=y的情况下T了
321529
Remarks楼主2023/12/15 08:26

应该是进死循环了,在 56 行的那个判非法情况的地方退出了,求调/kk

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdlib>
using namespace std;

const int NR=1000050;
int n,m;

struct point{
    int val,sum;
    int fa,s[3];
    int sz;
    int spn,tag;
    void newp(int id,int v){
        val=id;sum=v;
        fa=s[0]=s[1]=0;
        sz=1;spn=0;tag=0;
    }
}pt[NR];
int rt=0;
void check(){
    for(int i=1;i<=n;i++){
        printf("%d : fa %d, [%d-%d],val %d,sum%d,spn%d,sz%d\n",i,pt[i].fa,pt[i].s[0],pt[i].s[1],pt[i].val,pt[i].sum,pt[i].spn,pt[i].sz);
    }
}
inline int get(int x){
    if(pt[x].fa==0)return 2;
    if(x==pt[pt[x].fa].s[1])return 1;
    if(x==pt[pt[x].fa].s[0])return 0;
    return 2; 
}
void push_up(int p){
    pt[p].sz=pt[pt[p].s[0]].sz+pt[pt[p].s[1]].sz+1;
    pt[p].sum=pt[pt[p].s[0]].sum^pt[pt[p].s[1]].sum^pt[p].val;
}
void push_down(int p){
    if(pt[p].spn==1){
        swap(pt[p].s[0],pt[p].s[1]);
        pt[pt[p].s[0]].spn^=1;
        pt[pt[p].s[1]].spn^=1;
        pt[p].spn=0;
    }
}
void deal(int p){
    if(get(p)!=2)deal(pt[p].fa);
    push_down(p);
}
namespace splay{
    int ptot=0;
    void sp(int p){
        int fa=pt[p].fa,ls=pt[p].s[0],rs=pt[p].s[1];
        if(get(p)==2){
            cout<<"FALSE";
        }
        if(get(p)==0){
            pt[fa].s[0]=rs;pt[rs].fa=fa;
            pt[p].fa=pt[fa].fa;pt[pt[fa].fa].s[get(fa)]=p;
            pt[fa].fa=p;pt[p].s[1]=fa;
        }else{
            pt[fa].s[1]=ls;pt[ls].fa=fa;
            pt[p].fa=pt[fa].fa;pt[pt[fa].fa].s[get(fa)]=p;
            pt[fa].fa=p;pt[p].s[0]=fa;
        }
        push_up(fa),push_up(p);
    }
    void splay(int p){
        int fa=pt[p].fa;
        deal(p);
        while(get(p)!=2&&get(fa)!=2){
            if(get(p)==get(fa))sp(fa),sp(p);
            else sp(p),sp(p);
        }
        if(get(p)!=2)sp(p);
    }
}
int access(int p){
    int rs=0;
    while(p!=0){
        splay::splay(p);
        pt[p].s[1]=rs;
        push_up(p);
        rs=p;p=pt[p].fa;
    }
    return p;
}
void makeroot(int p){
    access(p);
    splay::splay(p);
    pt[p].spn^=1;push_down(p);
}
void link(int x,int y){
    makeroot(x);
    int p=y;while(pt[p].fa!=0)p=pt[p].fa;
    if(p==x){
        // printf("l");
        return;
    }
    pt[x].fa=y;
    push_up(y);
}
void cut(int x,int y){
    makeroot(x);
    access(y);
    if(pt[x].sz!=2){
        // printf("r");
        return;
    }
    pt[x].s[1]=0;pt[y].fa=0;push_up(y);
}
int query(int x,int y){
    makeroot(x);
    access(y);
    splay::splay(y);
    return pt[y].sum;
}
void mdf(int p,int v){
    splay::splay(p);
    pt[p].val=v;
    push_up(p);
}
int main(){
    // freopen("P3690.in","r",stdin);
    // freopen("P3690.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>pt[i].val;push_up(i);
    }
    for(int i=1;i<=m;i++){
        int op,x,y;cin>>op>>x>>y;
        if(op==0){
            cout<<query(x,y)<<endl;
        }
        if(op==1){
            link(x,y);
        }
        if(op==2){
            cut(x,y);
        }
        if(op==3){
            mdf(x,y);
        }
        // check();
    }

    return 0;
}
2023/12/15 08:26
加载中...