Cod sursa(job #586681)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 2 mai 2011 18:54:40
Problema Guvern Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<fstream>
#include<set>
#include<vector>

using namespace std;

vector < int > a[200005],v[200005];
int inc[200006],sf[200005],cost[200005],tmp,n,t[200005],niv[200005],din[200006],sol[200006];

struct cmp { bool operator () (int a, int b ) { return cost[a]<cost[b] || cost[a]==cost[b]&& niv[a]>niv[b] ; } };

bool comp ( int a, int b) { return inc[a]<inc[b]; }

multiset <int, cmp > ms;

int solve (int st, int dr) 
{
	if (st==dr)
		return din[sol[st]];
	else
	{
		int w,q,best=0;
		for (q=st+1;q<=dr;)
		{
			for (w=q;inc[sol[w]]<=sf[sol[q]] && w<=dr;++w);
				best+=solve(q,w-1);
			q=w;
		}
		
		best=max(best,din[sol[st]]);
		return best;
	}
}

void dinamic(int i)
{
	vector<int > :: iterator it;
	int k,w,q;
	
	for (it=v[i].begin();it<v[i].end();++it)
		if (*it!=t[i])
			dinamic(*it);
		
	k=0;
	for (it=a[i].begin();it<a[i].end();++it)
		sol[++k]=*it;
	if (k==0)
		din[i]=1;
	else
	{
		sort(sol+1,sol+k+1,comp);
		for (q=1;q<=k;)
		{
			for (w=q;inc[sol[w]]<=sf[sol[q]] && w<=k;++w);
			din[i]+=solve(q,w-1);
			q=w;
		}
		din[i]++;
	}
}

void arbore(int i)
{
	vector<int> :: iterator it;
	multiset < int, cmp> :: iterator sit;
	sit=ms.lower_bound(i);
	if (sit!=ms.end())
		a[*sit].push_back(i);
	ms.insert(i);
	
	for (it=v[i].begin();it<v[i].end();++it)
		if (*it!=t[i])
			arbore(*it);
		
	sit=ms.find(i);
	ms.erase(sit);
}

void cst(int i)
{
	vector<int> :: iterator it;
	
	inc[i]=++tmp;
	niv[i]=niv[t[i]]+1;
	
	for (it=v[i].begin();it<v[i].end();++it)
		if (*it!=t[i])
		{
			t[*it]=i;
			cst(*it);
		}
	sf[i]=tmp;
}

void citire()
{
	int i,x,y;
	ifstream f("guvern.in");
	f>>n;
	for (i=1;i<n;i++)
	{
		f>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	for (i=1;i<=n;i++)
		f>>cost[i];
	f.close();
}

void afisare()
{
	vector<int > :: iterator it;
	int sol=0,i;
	ofstream g("guvern.out");
	for (i=1;i<=n;i++)
		sol=max(sol,din[i]);
	g<<sol;
	g.close();
}

int main()
{
	citire();
	cst(1);
	arbore(1);
	dinamic(1);
	afisare();
	return 0;
}