社区讨论

10pts求助,救救孩子(

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lockjj4f
此快照首次捕获于
2023/10/30 15:18
2 年前
此快照最后确认于
2023/11/05 02:31
2 年前
查看原帖
A了一个点,还有一个点mle,希望大佬看看问题
CPP
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

long long f[500010][50];
long long depth[500010];
long long log[500010];
long long num[500010];
long long n;
long long a[500010];
vector<long long> g[500010];
bool vis[500010];

void dfs(long long fa,long long v,long long dpth){
	depth[v] = dpth;
	
	for(long long i = 1;i <= log[dpth];i++){
		f[v][i] = f[f[v][i-1]][i-1];
	}
	for(long long i = 0;i<g[v].size();i++){
		if(g[v][i] == fa)continue;
		f[g[v][i]][0] = v;
		dfs(v,g[v][i],dpth+1);
	}
}

long long lca(long long u,long long v){
	long long x = u;
	long long y = v;
	if(depth[x]<depth[y])swap(x,y);
	while(depth[x]>depth[y]){
		x = f[x][log[depth[x]-depth[y]]-1];
	}
	if(x == y )return x;
	for(long long k = log[depth[x]]-1;k>=0;--k){
		if(f[x][k] != f[y][k]){
			x = f[x][k];
			y = f[y][k];
		}
	}
	return f[x][0];
}

void dfs2(long long fa,long long node){
	
	for(long long i = 0;i<g[node].size();i++){
		if(g[node][i] == fa)continue;
		dfs2(node,g[node][i]);
		
	}
	num[fa] += num[node];
}

int main(){
	cin>>n;
	for(long long i =1;i<=n;i++){
		cin>>a[i];
		if(i>1)vis[a[i]] = 1;
	}
	for(long long i = 1;i<n;i++){
		long long x,y;
		cin>>x>>y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	for(long long i = 1;i<=n;i++){
        log[i] = log[i-1] + (1 << log[i-1] == i);
    }
    dfs(0,a[1],1);
	
    for(long long i = 1;i<=n-1;i++){
		long long l = lca(a[i],a[i+1]);
		num[a[i]]++;
		num[a[i+1]]++;
		num[l]--;
		num[f[l][0]]--;
	}
	dfs2(0,a[1]);
	for(long long i = 1;i<=n;i++){
		cout<<num[i]-vis[a[i]]<<endl;
	}
	return 0;
} 

回复

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

正在加载回复...