社区讨论

90分,走投无路了,请求帮助

P3258[JLOI2014] 松鼠的新家参与者 3已保存回复 9

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@mi6v70o8
此快照首次捕获于
2025/11/20 11:21
4 个月前
此快照最后确认于
2025/11/20 11:21
4 个月前
查看原帖
90分,走投无路了,请求帮助
CPP
#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
#define NM 600005
using namespace std;
queue<int> q;
int ver[NM],head[NM],nex[NM],tot,d[NM],n,m,Q,t,a[NM],f[NM][20],cnt[NM];
void add(int x,int y){
	ver[++tot]=y; nex[tot]=head[x]; head[x]=tot;
}
void bfs(int x){
	q.push(x); d[x]=1;
	while(q.size()){
		int x=q.front(); q.pop();
		for(int i=head[x];i;i=nex[i]){
			int y=ver[i];
			if(d[y]) continue;
			d[y]=d[x]+1;
			f[y][0]=x;
			FOR(j,1,t){
				f[y][j]=f[f[y][j-1]][j-1];
			}
			q.push(y);
		}
	}
}
int lca(int x,int y){
	if(d[x]>d[y]) swap(x,y);
	DOR(i,t,0) if(d[f[y][i]]>=d[x]) y=f[y][i];
	if(x==y) return x;
	DOR(i,t,0) if(f[y][i]!=f[x][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
void dfs(int x){
	for(int i=head[x];i;i=nex[i]){
		int y=ver[i];
		if(y!=f[x][0]){
			dfs(y);
			cnt[x]+=cnt[y];
		}
	}
}
int main(){	
//	freopen("data.out","r",stdin);
//	freopen("std.out","w",stdout);
	scanf("%d",&n);
	tot=0; t=(int)log(n)/log(2);
	FOR(i,1,n){
		scanf("%d",&a[i]);
	}
	FOR(i,1,n-1){
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b); add(b,a);
	}
	bfs(a[1]);
	FOR(i,1,n-1){
		int tmp=lca(a[i],a[i+1]);
		cnt[a[i]]++; cnt[a[i+1]]++;
		cnt[tmp]--; cnt[f[tmp][0]]--;
	}
//	FOR(i,1,n) printf("%d    ",cnt[i]); return 0;
	dfs(a[1]);
	FOR(i,2,n) cnt[a[i]]--;
	FOR(i,1,n) printf("%d\n",cnt[i]);
//	fclose(stdin); fclose(stdout);
	return 0;
}

回复

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

正在加载回复...