悬关求调,dfs序求lca+树上差分,样例过了但全WA
查看原帖
悬关求调,dfs序求lca+树上差分,样例过了但全WA
658620
Youth_Glory楼主2024/7/11 16:49

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll MAXN=3e5+5;
ll n,a[MAXN],cnt,d[MAXN];
ll dfn[MAXN],st[MAXN][20];
vector<ll>e[MAXN];

ll check(ll x,ll y){return dfn[x]<dfn[y]?x:y;}

void dfs(ll id,ll fa){
	st[(dfn[id]=++cnt)][0]=fa;
	for(ll it : e[id])if(it!=fa)dfs(it,id);
}

ll lca(ll u,ll v){
	if(u==v)return u;
	if((u=dfn[u])>(v=dfn[v]))swap(u,v);
	ll k=log2(v-(++u));
	return check(st[u][k],st[v-(1<<k)+1][k]);
}

void Answer(ll id,ll fa){
	for(ll it : e[id]){
		if(it!=fa){
			Answer(it,id);
			d[id]+=d[it];
		}
	}
}

int main()
{
	cin>>n;
	for(ll i=1;i<=n;i++)cin>>a[i];
	for(ll i=1,u,v;i<n;i++){
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(1,0);
	for(ll i=1;i<=n;i++)
		for(ll j=1;i+(1<<j)-1<=n;j++)
			st[i][j]=check(st[i][j-1],st[i+(1<<j-1)][j-1]);
	for(ll i=1,u,v;i<n;i++){
		u=a[i],v=a[i+1];
		ll LCA=lca(u,v);
		d[u]++;
		d[v]++;
		d[LCA]--;
		d[st[dfn[LCA]][0]]--;
	}
	Answer(1,0);
	for(ll i=2;i<=n;i++)d[a[i]]--;
	for(ll i=1;i<=n;i++)cout<<d[i]<<"\n";
	return 0;
}
2024/7/11 16:49
加载中...