社区讨论
死循环求条
P3690【模板】动态树(LCT)参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mknerzir
- 此快照首次捕获于
- 2026/01/21 10:33 4 周前
- 此快照最后确认于
- 2026/01/24 16:20 4 周前
代码过于抽象,求条。
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+5;
struct LCT{//link-cut tree
struct nd{
int fa,son[2];
int sum,val,tag,swp;
int sz;
}a[N];
#define ls son[0]
#define rs son[1]
void pu(int p){
a[p].sum=a[a[p].ls].sum^a[a[p].rs].sum^a[p].val;
a[p].sz=a[a[p].ls].sz+a[a[p].rs].sz;
}
void pd(int p){
if(a[p].swp){
a[p].swp=0;
swap(a[p].ls,a[p].rs);
if(a[p].ls)a[a[p].ls].swp^=1;
if(a[p].rs)a[a[p].rs].swp^=1;
}
}
void pa(int p){
if(get(p)>=0){
pa(a[p].fa);
}
pd(p);
}
int get(int p){
static int fa;
fa=a[p].fa;
if(a[fa].ls==p)return 0;
if(a[fa].rs==p)return 1;
return -1;
}
//
void rot(int u){
int fa=a[u].fa;
int ffa=a[fa].fa;
int rf=get(fa),r=get(u);
if(ffa)a[ffa].son[rf]=u;
else;
a[u].fa=ffa;
a[fa].son[r]=a[fa].son[r^1];
a[a[fa].son[r^1]].fa=fa;
a[fa].fa=u;
a[u].son[r^1]=fa;
pu(fa);pu(u);
}
void Sp(int u){
int fa,ffa;
pa(u);
while(get(u)>=0){
fa=a[u].fa,ffa=a[fa].fa;
if(ffa==0){
rot(u);
break;
}
if(get(fa)==get(u))rot(fa);
else rot(u);
rot(u);
}
}
int A(int u){//access
int v;
for(v=0;u;v=u,u=a[u].fa){
Sp(u);
a[u].rs=v;
pu(u);
}
return v;
}
void mkRT(int p){
p=A(p);
a[p].swp^=1;
pd(p);
}
int findf(int u){
u=A(u);
//Splay(u);
while(a[u].ls)pd(u),u=a[u].ls;
Sp(u);
return u;
}
bool lnk(int u,int v){
mkRT(u);
if(findf(v)==u)return 0;
Sp(u);
a[u].fa=v;
return 1;
}
//
void S(int u,int v){
mkRT(u);
A(v);
Sp(v);
}
bool cut(int u,int v){
if(findf(v)!=findf(u))return 0;
S(u,v);
if(a[u].fa!=v||a[u].sz>2)return 0;
a[u].fa=a[v].ls=0;
pu(u);
return 1;
}
void mkt();
}t;
int n,q;
int op,u,v;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>q;
for(int i=1,a;i<=n;i++){
cin>>a;
t.a[i].sum=t.a[i].val=a;
}
while(q--){
cin>>op>>u>>v;
if(op==0){
t.S(u,v);
cout<<t.a[v].sum<<'\n';
}else if(op==1){
t.lnk(u,v);
}else if(op==2){
t.cut(u,v);
}else{
t.Sp(u);
t.a[u].val=v;
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...