Submission #1320083

#TimeUsernameProblemLanguageResultExecution timeMemory
1320083JuanJLUnique Cities (JOI19_ho_t5)C++20
100 / 100
298 ms61112 KiB
#include <bits/stdc++.h>

#define fst first
#define snd second
#define pb push_back
#define forn(i,a,b) for(int i = a; i<b; i++)
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset(a,v,sizeof(a))
#define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;
typedef long long ll;

const int MAXN = 200000+5;

ll n,m;
vector<ll> adj[MAXN];
ll typ[MAXN];
ll dist[MAXN];
ll len[MAXN];
ll res[MAXN];

void dfs(ll nd, ll p, ll dis){
	dist[nd]=dis;
	len[nd]=0;
	for(auto i:adj[nd]) if(i!=p){
		dfs(i,nd,dis+1);
		len[nd]=max(len[nd],len[i]+1);
	}
}

ll resact = 0;
ll cnt[MAXN];

stack<pair<ll,ll>> pila;

void ndfs(ll nd, ll p){
	vector<pair<ll,ll>> radj; 
	for(auto i:adj[nd]) if(i!=p) radj.pb({(len[i]+1)*-1,i});

	sort(ALL(radj));

	ll maxi = (SZ(radj)>1?radj[1].fst*-1:0);
	for(auto i:radj){
		while(!pila.empty() && pila.top().fst>=dist[nd]-maxi){
			cnt[typ[pila.top().snd]]--;
			if(cnt[typ[pila.top().snd]]==0) resact--;
			pila.pop();
		}

		pila.push({dist[nd],nd});
		cnt[typ[nd]]++;
		if(cnt[typ[nd]]==1) resact++;
		
		ndfs(i.snd,nd);

		if(!pila.empty() && pila.top().snd==nd){
			pila.pop();
			cnt[typ[nd]]--;
			if(cnt[typ[nd]]==0) resact--;
		}
		
		maxi=max(maxi,i.fst*-1);
	}
	

	while(!pila.empty() && pila.top().fst>=dist[nd]-maxi){
			cnt[typ[pila.top().snd]]--;
			if(cnt[typ[pila.top().snd]]==0) resact--;
			pila.pop();
		}

		//cout<<maxi<<'\n';
		//cout<<"pila ";
		//stack<pair<ll,ll>> rp = pila; while(!rp.empty()) cout<<"("<<rp.top().snd<<","<<rp.top().fst<<") ", rp.pop(); cout<<'\n';
	//cout<<"RES "<<nd<<" "<<dist[nd]<<" "<<resact<<'\n';
	res[nd]=max(res[nd],resact);
}

int main(){
	cin>>n>>m;

	ll u,v;
	forn(i,0,n-1){
		cin>>u>>v; u--; v--;
		adj[u].pb(v);
		adj[v].pb(u);
	}	

	forn(i,0,n) cin>>typ[i];

	dfs(0,-1,0);

	pair<ll,ll> d1 = {-1,-1}; forn(i,0,n) d1=max(d1,{dist[i],i});

	dfs(d1.snd,-1,0);
	pair<ll,ll> d2 = {-1,-1}; forn(i,0,n) d2=max(d2,{dist[i],i});

	mset(res,0);
	mset(cnt,0);

	//cout<<"desde "<<d1.snd<<'\n';

	ndfs(d1.snd,-1);

	dfs(d2.snd,-1,0);

	//cout<<"desde "<<d2.snd<<'\n';
	ndfs(d2.snd,-1);

	forn(i,0,n) cout<<res[i]<<'\n';


	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...