Cod sursa(job #727509)

Utilizator bacilaBacila Emilian bacila Data 28 martie 2012 00:33:48
Problema Guvern Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 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 calc[200001],copii[200001],ag[200001],n;
int sub(vector<int> a)
{int i,j,m=0;
    for(i=0;i<a.size();i++)
 {calc[i]=0;
 for(j=0;j<i;j++)
 if(calc[i]<calc[j]&&ag[a[i]]<ag[a[j]])
 calc[i]=calc[j];
 calc[i]+=copii[a[i]];
 if(calc[i]>m) m=calc[i];   
 }
 return m;
}


void dfs(int nod)
{int i,j;
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]);

copii[nod]+=sub(vx[nod]);
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;
}