P3258WA+RE 求调
查看原帖
P3258WA+RE 求调
697299
hamster000楼主2023/5/5 23:05
#include <bits/stdc++.h>
using namespace std;

const int MAXN=50000+5;
int n;
vector <int> vec[MAXN];
int val[MAXN];// 存树

int a[MAXN];

int son[MAXN],fa[MAXN];
int siz[MAXN],dep[MAXN],top[MAXN];
void dfs1(int x,int f){
	dep[x]=dep[f]+1;siz[x]=1;fa[x]=f;
	
	for(auto to:vec[x]){
		if(to==f) continue;
		dfs1(to,x);
		siz[x]+=siz[to];
		if(siz[to]>siz[son[x]]) son[x]=to;
	}
}

void dfs2(int x,int tp){
    if(son[x]==0) return;
	top[x]=tp;
	dfs2(son[x],tp);
	for(auto to:vec[x]){
		if(to==fa[x]||to==son[x]) continue;
		dfs2(to,to);
	}	
} 

int LCA(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y]) return x;
	return y;
}



void dfs3(int x){
	for(auto to:vec[x]){
		if(to==fa[x]) continue;
		dfs3(to);
		val[x]+=val[to];
	}
}

int main(){
	cin >> n;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	for(int i=1,x,y;i<n;i++){
		cin >> x >> y;
		vec[x].push_back(y);
		vec[y].push_back(x);
	}
	dfs1(1,0);
	dfs2(1,1);
	for(int i=1;i<=n-1;i++){
		int lca=LCA(a[i],a[i+1]);
		val[a[i]]++,val[a[i+1]]++;
		val[lca]--,val[fa[lca]]--;
	}
	dfs3(1);
	for(int i=1;i<=n;i++) cout << val[i];
}

树刨+LCA+差分 不知道哪里错了。

2023/5/5 23:05
加载中...