LCT55pts求调
查看原帖
LCT55pts求调
1375749
Green_Leaves楼主2024/7/14 08:25
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
    node *l=NULL,*r=NULL,*fa=NULL;
    ll val;
    ll sons=0,sum=0;bool lazy_tag=0;
}splays[100005];
ll operation(ll a,ll b){return a^b;}
bool is_root(node* n){
    if(n->fa==NULL)return 1;
    if(n!=n->fa->l&&n!=n->fa->r)return 1;
    return 0;
}
void updata(node* u){
    u->sons=1+(u->l?u->l->sons:0)+(u->r?u->r->sons:0);
    u->sum=operation(u->val,operation((u->l?u->l->sum:0),(u->r?u->r->sum:0)));
}
void push_down(node* u){
    if(u->lazy_tag){
        swap(u->l,u->r);
        u->lazy_tag=0;
        if(u->l)u->l->lazy_tag=!(u->l->lazy_tag);
        if(u->r)u->r->lazy_tag=!(u->r->lazy_tag);
    }
}
ll get_direction(node* u){//0是l,1是r,-1代表u是树根
    if(u->fa==NULL)return -1;
    if(u->fa->l==u)return 0;
    if(u->fa->r==u)return 1;
}
node* get_this_splay_root(node* u){
    return (is_root(u)?u:get_this_splay_root(u->fa));
}
void all_push(node* u){
    if(!is_root(u))all_push(u->fa);
    push_down(u);
}
void rotate(node* u){
    node* f=u->fa,*g=u->fa->fa;
    bool l_or_r=get_direction(u);
    if(!l_or_r){
        f->l=u->r;
        if(f->l)f->l->fa=f;
    }else{
        f->r=u->l;
        if(f->r)f->r->fa=f;
    }
    f->fa=u;
    if(!l_or_r)u->r=f;
    else u->l=f;
    u->fa=g;
    if(g){
        if(g->l==f)g->l=u;
        else g->r=u;
    }
    updata(f);
    updata(u);
}
void splay(node* u){
    all_push(u);
    while(!is_root(u)){
        if(!is_root(u->fa)){
            if(get_direction(u)==get_direction(u->fa))rotate(u->fa);
            else rotate(u);
        }
        rotate(u);
    }
}
void access(node* u){
    node* u2=u;
    for(node* x=NULL;u;x=u,u=u->fa){
        splay(u);
        u->r=x;
        updata(u);
    }
    splay(u2);
}
void make_root(node* u){
    access(u);
    u->lazy_tag^=1;
}
node* find_root(node* u){
    access(u);
    while(u->l)u=u->l;
    return u;
}
void link(node* u,node* v){
    if(find_root(u)!=find_root(v)){
        make_root(u);
        u->fa=v;
    }
} 
void split(node* u,node* v){
    make_root(u);
    access(v);
}  
void cut(node* u,node* v){
    split(u,v);
    if(v->l==u && !u->r){ // 如果 u 是 v 的左子节点且 u 的右子节点为空
        u->fa=v->l=NULL;
        updata(u),updata(v);
    }
}
ll sum(node* u,node* v){
    split(u,v);
    return v->sum;
}
void revise(node* u,ll val){
    splay(u);
    u->val=val;
    updata(u);
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0),cout.tie(0); 
    ll n,m,u,x,y;
    cin>>n>>m;
    for(ll i=1;i<=n;i++){
        cin>>splays[i].val;
        splays[i].sum=splays[i].val;
    }
    while(m--){
        cin>>u>>x>>y;
        if(u==0)cout<<sum(splays+x,splays+y)<<'\n';
        if(u==1)link(splays+x,splays+y);
        if(u==2)cut(splays+x,splays+y);
        if(u==3)revise(splays+x,y);
    }
}

过了的点:1,2,3,10,12,13

2024/7/14 08:25
加载中...