Pagini recente » Cod sursa (job #2773267) | Cod sursa (job #2606097) | Cod sursa (job #1903059) | Cod sursa (job #2095915) | Cod sursa (job #586681)
Cod sursa(job #586681)
#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;
}