Cod sursa(job #3364562)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 5 septembrie 2026 15:35:17
Problema Guvern Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
using dbl=long double;
constexpr int NMAX=200'005;
constexpr ll MOD=1'000'000'007;

int N;
int v[NMAX];
std::vector<int> G[NMAX];
int nxt[NMAX];
int dp[NMAX];

void dfs0(int node, std::set<std::pair<int, int> >& S, int tt=-1)
{
	nxt[node]=-1;
	auto it=S.lower_bound({v[node], -1});
	if(it!=S.end())
		nxt[node]=it->second;

	S.insert({v[node], node});
	for(int i=0;i<sz(G[node]);++i)
	{
		if(G[node][i]==tt)
		{
			G[node][i]=G[node].back();
			G[node].pop_back();
			--i;
		}
		else
			dfs0(G[node][i], S, node);
	}
	S.erase({v[node], node});
}

void dfs1(int node, std::map<int, int>& M)
{
	int t=0;
	for(int x : G[node])
	{
		std::map<int, int> m;
		dfs1(x, m);
		t+=dp[x];
		if(sz(m)>sz(M))
			std::swap(m, M);
		for(std::pair<int, int> p : m)
			M[p.first]+=p.second;
	}

	int x=1;
	if(M.count(node))
	{
		x+=M[node];
		M.erase(node);
	}
	if(nxt[node]==-1)
		dp[node]=x;
	else
		M[nxt[node]]=std::max(M[nxt[node]], x);

	if(dp[node]<t)
		dp[node]=t;
}

int main()
{
	FILE* f=fopen("guvern.in", "r"), *g=fopen("guvern.out", "w");
	int i, a, b;

	fscanf(f, "%d", &N);
	for(i=1;i<N;++i)
	{
		fscanf(f, "%d%d", &a, &b);
		--a;
		--b;
		G[a].push_back(b);
		G[b].push_back(a);
	}
	for(i=0;i<N;++i)
		fscanf(f, "%d", v+i);

	std::set<std::pair<int, int> > S;
	dfs0(0, S);

	std::map<int, int> M;
	dfs1(0, M);

	fprintf(g, "%d\n", dp[0]);

	fclose(f);
	fclose(g);
	return 0;
}