社区讨论

T了全部。。求条

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mhjag2g8
此快照首次捕获于
2025/11/03 23:21
4 个月前
此快照最后确认于
2025/11/03 23:21
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int MAX = 300005;
const int MAXX = MAX << 1;
int n,m,a[MAX],head[MAX],cnt;

struct egde{
	int u,v,next;
}e[MAXX];

void add(int u,int v){
	e[cnt++].u = u;
	e[cnt].v = v;
	e[cnt].next = head[u];
	head[u] = cnt;
}

int fa[MAX][31],dep[MAX];

void dfs(int u,int f){
	fa[u][0] = f;
	dep[u] = dep[f] + 1;
	for(int i = 1;i <= 30; i++)
		fa[u][i] = fa[fa[u][i-1]][i-1];
	for(int i = head[u];i;i = e[i].next){
		int v = e[i].v;
		if(v == f)
			continue;
		dfs(v,u);
	}
}

int lca(int x,int y){
	if(dep[x] < dep[y])
		swap(x,y);
	for(int i = 30;i >= 0; i--){
		if(dep[fa[x][i]] >= dep[y])
			x = fa[x][i];
	}
	if(x == y)
		return x;
	for(int i = 30;i >= 0;i --){
		if(fa[x][i] != fa[y][i]){
			x = fa[x][i];
			y = fa[y][i];
		}
	} 
	return fa[x][0];
}

int num[MAX];

int answer(int u,int f){
	for(int i = head[u];i;i = e[i].next){
		int v = e[i].v;
		if(v == f)
			continue;
		answer(v,u);
		num[u] += num[v];
	}
}

int main(){
	cin >> n;
	for(int i = 1;i <= n; i++)
		cin >> a[i];
	int t1,t2;
	for(int i = 1;i < n; i ++){
		cin >> t1 >> t2;
		add(t1,t2);
		add(t2,t1);
	} 
	dfs(1,0);
	for(int i = 1;i < n; i++){
		int u = a[i],v = a[i+1];
		int t = lca(u,v);
		num[fa[t][0]] -= 1;
		num[t] -= 1;
		num[u] += 1;
		num[v] += 1;
	}
	answer(1,0);
	for(int i = 2;i  <= n; i++)
		num[a[i]] --;
	for(int i = 1;i <= n; i++)
		cout << num[i] << "\n";
	return 0;
}

回复

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

正在加载回复...