5MLE5WA树剖求调
查看原帖
5MLE5WA树剖求调
236243
2018090807L楼主2022/9/4 17:41

思路同第一篇题解

#include<bits/stdc++.h>
using namespace std;
const int N=30005,M=100005;
int n,m,cnt=0,sum=0;
int u[N],v[N],f[N],dep[N],siz[N],mson[N],top[N];
int ans[M],idx[N],op[M];
vector<int> to[N];
bool book[N],ca[N][N];
struct edge{
	int l,r,val,tp,laz;
}t[N*4];
void spread(int p){
	if(!t[p].laz)return;
	t[p*2].laz=t[p*2+1].laz=1;
	t[p].laz=0;
	t[p*2].val=t[p*2+1].val=0;
	t[p*2].tp=t[p*2+1].tp=0;
}
void dfs1(int x,int fa){
	book[x]=1;
	f[x]=fa;
	siz[x]=1;
	dep[x]=dep[fa]+1;
	for(int i=0;i<to[x].size();i++){
		int y=to[x][i];
		if(book[y]||ca[x][y])continue;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(siz[y]>siz[mson[x]]){
			mson[x]=y;
		}
	}
}
void dfs2(int x,int topx){
	idx[x]=++sum;
	book[x]=1;
	top[x]=topx;
	if(mson[x])dfs2(mson[x],topx);
	for(int i=0;i<to[x].size();i++){
		int y=to[x][i];
		if(book[y]||ca[x][y])continue;
		dfs2(y,y);
	}
}
void build(int p,int l,int r){
	t[p].l=l;
	t[p].r=r;
	if(l==r){
		if(l!=1)t[p].val=1;
		return;
	}int mid=(t[p].l+t[p].r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].val=t[p*2].val+t[p*2+1].val;
}
void change(int p,int l,int r){
	if(t[p].l>=l&&t[p].r<=r){
		t[p].val=0;
		t[p].tp=0;
		t[p].laz=1;
		return;
	}spread(p);
	int mid=(t[p].l+t[p].r)/2;
	if(l<=mid)change(p*2,l,r);
	if(r>mid)change(p*2+1,l,r);
	t[p].val=t[p*2].val+t[p*2+1].val;
}
int query(int p,int l,int r){
	spread(p);
	if(t[p].l>=l&&t[p].r<=r){
		return t[p].val;
	}int mid=(t[p].l+t[p].r)/2;
	int res=0;
	if(l<=mid)res+=query(p*2,l,r);
	if(r>mid)res+=query(p*2+1,l,r);
	return res;
}
void cha(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		change(1,idx[top[x]],idx[x]);
		x=f[top[x]];
	}if(dep[x]<dep[y])swap(x,y);
	int yy;
	for(int i=0;i<to[y].size();i++){
		if(top[to[y][i]]==top[x]&&to[y][i]!=f[y]){
			yy=to[y][i];
			break;
		}
	}
	change(1,idx[yy],idx[x]);
}
int ask(int x,int y){
	int res=0;
	while(top[x]!=top[y]){
	//	printf("%d %d\n",x,y);
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		res+=query(1,idx[top[x]],idx[x]);
		x=f[top[x]];
	}if(dep[x]<dep[y])swap(x,y);
	int yy;
	for(int i=0;i<to[y].size();i++){
		if(top[to[y][i]]==top[x]&&to[y][i]!=f[y]){
			yy=to[y][i];
			break;
		}
	}
	res+=query(1,idx[yy],idx[x]);
	return res;
}
int main(){
	scanf("%d%d",&n,&m);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		to[x].push_back(y);
		to[y].push_back(x);
	}
	while(1){
		cnt++;
		scanf("%d",&op[cnt]);
		if(op[cnt]==-1)break;
		scanf("%d%d",&u[cnt],&v[cnt]);
		if(op[cnt]==0){
			ca[u[cnt]][v[cnt]]=1;
			ca[v[cnt]][u[cnt]]=1;
		}
	}cnt--;
	dfs1(1,0);
	memset(book,0,sizeof(book));
	dfs2(1,1);
	for(int i=cnt;i>=1;i--){
		if(op[i]==1){
			ans[i]=ask(u[i],v[i]);
		}else{
			cha(u[i],v[i]);
		}
	}for(int i=1;i<=cnt;i++){
		if(op[i]==0)continue;
		printf("%d\n",ans[i]);
	}
	return 0; 
}
2022/9/4 17:41
加载中...