Cod sursa(job #647724)

Utilizator indestructiblecont de teste indestructible Data 11 decembrie 2011 21:31:46
Problema Guvern Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <set>
#define NMAX 200005
#define pii pair <int,int>
#define pb push_back
#define mp make_pair
#define f first
#define s second
using namespace std; 
int n,B[NMAX],st[NMAX],dr[NMAX],r,t,best[NMAX],E[NMAX],ord[NMAX],rez;
vector <int> A[NMAX],C[NMAX];
pair <pii,int> D[NMAX];
set <pii> H,G;
set <pii> :: iterator it;
char viz[NMAX];
void read()
{
	scanf("%d",&n);
	int i,x,y;
	for (i=1; i<n; i++)
	{
		scanf("%d%d",&x,&y);
		A[x].pb(y);
		A[y].pb(x);
		ord[i]=i;
	}
	for (i=1; i<=n; i++)
		scanf("%d",&B[i]);
}
void dfs(int nod)
{
	viz[nod]=1;
	st[nod]=++r;
	it=H.upper_bound(mp(B[nod],0));
	if (it!=H.end())
		C[(*it).s].pb(nod);
	H.insert(mp(B[nod],nod));
	
	int i,vec;
	for (i=0; i<A[nod].size(); i++)
	{
		vec=A[nod][i];
		if (!viz[vec])
			dfs(vec);
	}
	H.erase(mp(B[nod],nod));
	dr[nod]=r;
}
inline int max(int x,int y)
{
	return x>y ? x : y;
}
void rezolva(int nod)
{
	int i,j,vec;
	t=0;
	for (i=0; i<C[nod].size(); i++)
	{
		vec=C[nod][i];
		D[++t].f.f=st[vec]; D[t].f.s=dr[vec]; D[t].s=vec;
	}
	sort(D+1,D+t+1);
	if (t)
	{
		for (i=1; i<=t; i++)
		{
			E[i]=0;
			for (j=1; j<i; j++)
				if (D[j].f.s<D[i].f.f)
					E[i]=max(E[i],E[j]);
			E[i]+=best[D[i].s];
			best[nod]=max(best[nod],E[i]);
		}
	}
	best[nod]++;
}
void find_sol()
{
	int i;
	for (i=1; i<=n; i++)
		rezolva(ord[i]);
	for (i=1; i<=n; i++)
		rez=max(rez,best[i]);
}
bool comp(int x,int y)
{
	return B[x]<B[y];
}
int main()
{
	freopen("guvern.in","r",stdin);
	freopen("guvern.out","w",stdout);
	read();
	dfs(1);
	sort(ord+1,ord+n+1,comp);
	find_sol();
	printf("%d\n",rez);
	return 0;
}