社区讨论

线段树51pts,求条

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@m2ejvdug
此快照首次捕获于
2024/10/18 17:51
去年
此快照最后确认于
2025/11/04 16:55
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=3e5;
int n,m,tot,head[N],dfn[N],T,t[N<<2],a[N]={-1},sz[N],laz[N];
struct qp{
	int to,ne;
}e[N<<1];
void add(int u,int v){
	e[++tot]={v,head[u]};
	head[u]=tot;
}
void dfs(int u,int f){
	dfn[u]=++T;
	a[dfn[u]]=a[dfn[f]]+1;
	sz[dfn[u]]=1;
	for(int i=head[u];i;i=e[i].ne){
		int v=e[i].to;
		if(v==f)	continue;
		dfs(v,u);
		sz[dfn[u]]+=sz[dfn[v]];
	}
}
void ln(int rt,int l,int r){
	int mid=l+r>>1;
	laz[rt<<1]+=laz[rt],laz[rt<<1|1]+=laz[rt];
	t[rt<<1]-=(mid-l+1)*laz[rt];
	t[rt<<1|1]-=(r-mid)*laz[rt];
	t[rt]=t[rt<<1]+t[rt<<1|1];
	laz[rt]=0;
}
void build(int rt,int l,int r){
	if(l==r){
		t[rt]=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	t[rt]=t[rt<<1]+t[rt<<1|1];
}
void xg(int rt,int l,int r,int fl,int fr){
	if(fl<=l && r<=fr){
		laz[rt]++;
		t[rt]-=(r-l+1);
		return ;
	}
	if(laz[rt])	ln(rt,l,r);
	int mid=l+r>>1;
	if(fl<=mid)	xg(rt<<1,l,mid,fl,fr);
	if(mid<fr)	xg(rt<<1|1,mid+1,r,fl,fr);
	t[rt]=t[rt<<1]+t[rt<<1|1];
}
int fd(int rt,int l,int r,int f){
	if(l==r)	return t[rt];
	if(laz[rt])	ln(rt,l,r);
	int mid=l+r>>1;
	if(f<=mid)	return fd(rt<<1,l,mid,f);
	else	return fd(rt<<1|1,mid+1,r,f);
}
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs(1,0);
	build(1,1,n);
//	for(int i=1;i<=n;i++)
//		cout<<i<<":"<<a[dfn[i]]<<" "<<sz[i]<<endl; 
	cin>>m;
	for(int i=1;i<=n+m-1;i++){
		char op;
		int x,y;
		cin>>op>>x;
		x=dfn[x];
		if(op=='A'){
			cin>>y;
			y=dfn[y];
			if(y>x)	swap(x,y);
			xg(1,1,n,x,x+sz[x]-1);
		}
		else	cout<<fd(1,1,n,x)<<endl;
	}
	return 0;
}

回复

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

正在加载回复...