Cod sursa(job #639146)

Utilizator indestructiblecont de teste indestructible Data 22 noiembrie 2011 16:38:30
Problema Guvern Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <set>
#define NMAX 200005
#define LMAX 3000005
#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],dad[NMAX],st[NMAX],dr[NMAX],r,best[NMAX],E[NMAX],poz,rez,act,ant;
vector <int> A[NMAX],C[NMAX],F,K,PK[NMAX];
vector < pair <pii,int> > D[NMAX];
vector <int> :: iterator it2;
set <pii> H,G;
set <pii> :: iterator it;
char viz[NMAX],line[LMAX];
inline int cif(char x)
{
	return x>='0' && x<='9';
}
void read()
{
	scanf("%d\n",&n);
	int i,x,y,semn;
	for (i=1; i<n; i++)
	{
		scanf("%d%d\n",&x,&y);
		A[x].pb(y);
		A[y].pb(x);
	}
	fgets(line+1,LMAX,stdin);
	for (i=1; i<=n; i++)
	{
		semn=1;
		while (!cif(line[poz+1]))
		{
			poz++; 
			if (line[poz]=='-') 
				semn=-1;
		}
		while (cif(line[poz+1]))
		{ 
			poz++; 
			B[i]=B[i]*10+line[poz]-'0'; 
		}
		B[i]*=semn;
	}
}
void dfs(int nod)
{
	viz[nod]=1;
	st[nod]=++r;
	it=H.lower_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;
}
void prepare()
{
	int i,j,vec;
	for (i=1; i<=n; i++)
	{
		for (j=0; j<C[i].size(); j++)
		{
			vec=C[i][j];
			D[i].pb(mp(mp(st[vec],dr[vec]),vec));
		}
		sort(D[i].begin(),D[i].end());
	}
}
inline int max(int x,int y)
{
	return x>y ? x : y;
}
void dfs2(int nod)
{
	viz[nod]=1;
	int i,j,vec,vec2;
	for (i=0; i<A[nod].size(); i++)
	{
		vec=A[nod][i];
		if (!viz[vec])
			dfs2(vec);
	}
	
	
	//normalizare valori
	F=K;
	for (i=0; i<D[nod].size(); i++)
	{
		vec=D[nod][i].s;
		E[i]=0;
		F.pb(st[vec]); F.pb(dr[vec]);
	}
	sort(F.begin(),F.end());
	it2=unique(F.begin(),F.end());
	F.resize(it2-F.begin());
	for (i=0; i<D[nod].size(); i++)
	{
		vec=D[nod][i].s;
		D[nod][i].f.f=(lower_bound(F.begin(),F.end(),st[vec])-F.begin());
		D[nod][i].f.s=(lower_bound(F.begin(),F.end(),dr[vec])-F.begin());
	}
	
	
	//dinamica pe fii
	for (i=0; i<F.size(); i++)
		PK[i].clear();
	act=0; ant=-1;
	for (i=0; i<D[nod].size(); i++)
	{
		vec=D[nod][i].s;
		while (ant+1<D[nod][i].f.f)
		{
			ant++;
			for (j=0; j<PK[ant].size(); j++)
			{
				vec2=PK[ant][j];
				act=max(act,E[vec2]);
			}
		}
		PK[D[nod][i].f.s].pb(i);
		E[i]=act+best[vec];
	}
	
	for (i=0; i<D[nod].size(); i++)
		best[nod]=max(best[nod],E[i]);
	best[nod]++;
}
void find_sol()
{
	int i;
	for (i=1; i<=n; i++)
		rez=max(rez,best[i]);
}
int main()
{
	freopen("guvern.in","r",stdin);
	freopen("guvern.out","w",stdout);
	read();
	dfs(1);
	prepare();
	memset(viz,0,sizeof(viz));
	dfs2(1);
	find_sol();
	printf("%d\n",rez);
	return 0;
}