Cod sursa(job #3334722)

Utilizator mihaigeorgescuGeorgescu Mihai mihaigeorgescu Data 19 ianuarie 2026 11:54:51
Problema Guvern Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
#include <set>
#define int long long
using namespace std;
ifstream fcin("guvern.in");
ofstream fout("guvern.out");
int n,x,y,val[200005],dp[200005],rez;
vector <int> v[200005],u[200005];
set < pair <int,int> > s;
int st[200005],dr[200005],nr;
inline void tour(int nod, int p)
{
    st[nod]=++nr;
    auto it=s.lower_bound({val[nod],0});
    u[(it!=s.end() ? it->second : 0)].emplace_back(nod);
    s.insert({val[nod],nod});
    for(int i : v[nod]) if(i!=p)
        tour(i,nod);
    s.erase({val[nod],nod});
    dr[nod]=nr;
}
struct elem
{
    int st,dr,x;
    bool operator<(const elem &x) const
    {
        return dr<x.dr;
    }
};
inline int cb(int x, int sz, vector <elem> &c)
{
    int sol=0;
    for(int i=(1<<20); i>0; i>>=1)
        if((sol|i)<sz && c[sol|i].dr<x) sol|=i;
    return sol;
}
inline int solve(int nod)
{
    vector <elem> c;
    c.push_back({0,0,0});
    for(int i : u[nod])
      c.push_back({st[i],dr[i],dp[i]});
    if(c.empty()) return 0;
    sort(c.begin(), c.end());
    vector <int> dp(c.size()+3, 0);
    for(int i=1; i<c.size(); i++)
        dp[i]=max(dp[i-1],dp[cb(c[i].st,i,c)]+c[i].x);
    return dp[c.size()-1];
}
inline void dfs(int nod, int p)
{
    for(int i : v[nod]) if(i!=p)
        dfs(i,nod);
    dp[nod]=solve(nod)+1;
    rez=max(rez,dp[nod]);
}
signed main()
{
    fcin>>n;
    for(int i=1; i<n; i++)
    {
        fcin>>x>>y;
        v[x].emplace_back(y);
        v[y].emplace_back(x);
    }
    for(int i=1; i<=n; i++)
        fcin>>val[i];
    tour(1,0);
    dfs(1,0);
    fout<<max(rez,solve(0));
    return 0;
}