Cod sursa(job #1165417)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 2 aprilie 2014 17:53:42
Problema Guvern Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<iostream>
#include<fstream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;

#define NMAX 200001

vector <int> v[NMAX],each[NMAX];
set <pair <int , int> > s;
int viz[NMAX],d[NMAX],val[NMAX];

void dfs(int nod)
{
	viz[nod]=1;
	s.insert(make_pair(val[nod],nod));
	d[nod]=1;
	for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++)
		if(viz[*it]==0) {
			each[nod].clear();
			dfs(*it);
			if(each[nod].begin()!=each[nod].end())
				d[nod]=d[nod]+(*max_element(each[nod].begin(),each[nod].end()));
		}
	s.erase(make_pair(val[nod],nod));
	set <pair <int, int> > :: iterator x = s.lower_bound(make_pair(val[nod],0));
	if(x!=s.end())
		each[x->second].push_back(d[nod]);
}

int main()
{
	int i,n,x,y;
	ifstream f("guvern.in");
	ofstream g("guvern.out");
	f>>n;
	for(i=1;i<=n-1;i++) {
		f>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	for(i=1;i<=n;i++)
		f>>val[i];
	f.close();
	dfs(1);
	g<<*max_element(d+1,d+n+1);
	g.close();
	return 0;
}