社区讨论

树剖跟你报了,悬三关求条

P3459[POI 2007] MEG-Megalopolis参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@micic1d7
此快照首次捕获于
2025/11/24 10:08
3 个月前
此快照最后确认于
2025/11/24 12:53
3 个月前
查看原帖
rt,only AC #1#2,其它全 WA。
CPP
#include<bits/stdc++.h>
using namespace std;

int n,m;
vector<int> e[250005];
int dep[250005],hvy[250005],siz[250005],fa[250005];
int top[250005],id[250005],val[250005],cnt;
int t[1000005];

void build(int l,int r,int p){
	if(l==r){
		t[p]=val[l];
		return;
	}
	int mid=l+r>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	t[p]=t[p<<1]+t[p<<1|1];
	return;
}

void add(int l,int r,int p,int x,int y){
//	cout<<l<<" "<<r<<" "<<x<<" "<<y<<endl;
	if(l==r){
		t[p]=0;
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) add(l,mid,p<<1,x,y);
	if(y>mid) add(mid+1,r,p<<1|1,x,y);
	t[p]=t[p<<1]+t[p<<1|1];
	return;
}

int query(int l,int r,int p,int x,int y){
	if(x<=l&&r<=y) return t[p];
	int mid=l+r>>1,res=0;
	if(x<=mid) res+=query(l,mid,p<<1,x,y);
	if(y>mid) res+=query(mid+1,r,p<<1|1,x,y);
	return res;
}

void addPath(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
//		cout<<"path:"<<x<<" "<<top[x]<<" "<<id[x]<<" "<<id[top[x]]<<endl;
		add(1,n,1,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])
		swap(x,y);
	add(1,n,1,id[y],id[x]);
	return;
}

int queryPath(int x,int y){
	int res=0;
	while(top[x]!=top[y]){
//		cout<<x<<" "<<y<<endl;
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		res+=query(1,n,1,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])
		swap(x,y);
	res+=query(1,n,1,id[y],id[x]);
	return res;
}

void dfs1(int u,int f){
	dep[u]=dep[f]+1;fa[u]=f;siz[u]=1;
	for(auto v:e[u]){
		if(v==f) continue;
		dfs1(v,u);
		if(siz[v]>siz[hvy[u]]) 
			hvy[u]=v;
		siz[u]+=siz[v];
	}
	return;
}

void dfs2(int u,int head){
	top[u]=head;id[u]=++cnt;
	val[cnt]=!(u==1);
	if(!hvy[u]) return;
	dfs2(hvy[u],head);
	for(auto v:e[u]){
		if(v==fa[u]||v==hvy[u])
			continue;
		dfs2(v,v);
	}
	return;
}

int main(){
	cin>>n;
	for(int i=1,u,v;i<n;i++){
		cin>>u>>v;
		e[u].push_back(v);
	}
	dfs1(1,0);dfs2(1,1);build(1,n,1);
	cin>>m;
	for(int i=1;i<=n+m-1;i++){
		char opt;cin>>opt;
//		for(int j=1;j<=n;j++)
//			cout<<query(1,n,1,id[j],id[j])<<" ";
//		cout<<endl;
		if(opt=='A'){
			int x,y;
			cin>>x>>y;
			addPath(x,y);
		}else{
			int x;
			cin>>x;
			cout<<queryPath(x,1)<<endl;
		}
	}
}

回复

3 条回复,欢迎继续交流。

正在加载回复...