60分求调
查看原帖
60分求调
1312367
lucus_Fu0202楼主2025/8/4 22:11
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <string>
#include <iomanip>
#include <vector>
#include <set>
#include <cctype>
#include <stack>
#include <map>
#include <list>
#include <array>
#include <deque>
#include <bitset>
typedef long long ll;
typedef long double lld;
#define Debug(x) cout<<#x<<":"<<x<<"("<<__LINE__<<")and("<<__FUNCTION__<<")"<<'\n'
using namespace std;
int n, m, r, head[20005], nex[20005], to[20005], en, p[50005], size[10005], fa[10005],ans[10005];
bool visited[10005],flag[10005];
void add(int x, int y) {
	nex[++en] = head[x];
	head[x] = en;
	to[en] = y;
}
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
void dfs(int now,int father) {
	fa[now] = father;
	visited[now] = true;
	size[now] = 1;
	for(int i = head[now] ; i ; i = nex[i]) {
		int temp = to[i];
		if(visited[temp]) continue;
		dfs(temp,now);
		size[now] += size[temp];
	}
}
int main() {
	//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	memset(flag,true,sizeof(flag));
	cin >> n >> r >> m;
	for (int i = 1 ; i < n ; i++) {
		int u, v;
		cin >> u >> v;
		add(u, v);
		add(v, u);
	}
	dfs(r,r);
	for (int i = 1 ; i <= m ; i++) {
		p[i] = read();
		int sum = 0;
		for(int j = head[p[i]] ; j ; j = nex[j]) {
			int temp = to[j];
			if(temp == fa[p[i]]) continue;
			sum += pow(size[temp],2);
		}
		if(flag) {
			ans[p[i]] = pow(size[p[i]],2) - sum;
			flag[p[i]] = false;
    		cout<<pow(size[p[i]],2) - sum<<'\n';
		}else{
            cout<<ans[p[i]];
        }
	}
	return 0;
}
2025/8/4 22:11
加载中...