Pagini recente » Cod sursa (job #2062119) | Cod sursa (job #1038934) | Cod sursa (job #821159) | Cod sursa (job #887141) | Cod sursa (job #727508)
Cod sursa(job #727508)
#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;
}