Cod sursa(job #727482)

Utilizator bacilaBacila Emilian bacila Data 27 martie 2012 23:57:59
Problema Guvern Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <vector>
#include <set>
#include <fstream>
#define mp make_pair
#define pb push_back
using namespace std;
vector<int> vx[200001],v[200001];
bool tata[200001];
set<pair<int,int> > s;
set<pair<int,int> >::iterator it;
int copii[200001],ag[200001],n;
void dfs(int nod)
{int i,j,ma;
copii[nod]=1;
pair<set <pair<int,int> >::iterator,bool> ret;
it=s.upper_bound(mp(ag[nod],0));
if(it!=s.end())
{vx[it->second].pb(nod);
tata[nod]=true;}
ret=s.insert(mp(ag[nod],nod));
for(i=0;i<v[nod].size();i++)
if(!copii[v[nod][i]])
{
dfs(v[nod][i]);
ma=0;
for(j=0;j<vx[nod].size();j++)
ma=max(copii[vx[nod][j]],ma);
copii[nod]+=ma;
vx[nod].clear();
}
s.erase(ret.first);
}

int main ()
{int i,x,y,ma=0;
    ifstream f("guvern.in");
 ofstream g("guvern.out");
f>>n;
for(i=1;i<n;i++)
{f>>x>>y;
v[x].pb(y);
v[y].pb(x);}
for(i=1;i<=n;i++)
f>>ag[i];
dfs(1);
for(i=1;i<=n;i++)
if(!tata[i])
ma=max(ma,copii[i]);
g<<ma;
 f.close(); g.close();
return 0;
}