Cod sursa(job #2607155)

Utilizator bogdi1bogdan bancuta bogdi1 Data 29 aprilie 2020 13:31:40
Problema Guvern Scor 0
Compilator cpp-32 Status done
Runda why Marime 1.61 kb
#include <cstdio>
#include <set>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = 1000000005;
struct Nod
{
    int cost,lvl;
};
struct Cmp
{
    bool operator()(const Nod &a, const Nod &b)
    {
        if(a.cost==b.cost)
            return a.lvl>b.lvl;
        return a.cost<b.cost;
    }
};
set<Nod, Cmp> s;
vector<int> g[200005];
int costuri[200005];
int salt[200005];
bool viz[200005];
int level[200005];
int ans[200005];
int maxx[200005];
set<Nod,Cmp>::iterator it;
void dfs(int nod, int lvl)
{
    viz[nod]=1;
    level[lvl]=nod;
    it=s.lower_bound({costuri[nod], INF});
    if(it!=s.end())
        salt[nod]=level[it->lvl];
    else
        salt[nod]=0;
    s.insert({costuri[nod], lvl});
    int maxxx=0;
    for(int i=0; i<g[nod].size(); i++)
        if(viz[g[nod][i]]==0){
            dfs(g[nod][i], lvl+1);
            maxxx+=maxx[salt[nod]];
            if(g[nod].size()>2)
                memset(maxx, 0, sizeof(maxx));
        }
    ans[nod]++;
    ans[salt[nod]]=max(ans[salt[nod]], ans[salt[nod]]-maxxx+ans[nod]);
    maxx[salt[nod]]=max(maxx[salt[nod]], ans[nod]);
    s.erase({costuri[nod], lvl});
}
int main()
{   freopen("guvern.in", "r", stdin);
    freopen("guvern.out", "w", stdout);
    int n,i,x,y,sol=0;
    scanf("%d", &n);
    for(i=1; i<n; i++){
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(i=1; i<=n; i++)
        scanf("%d", &costuri[i]);
    dfs(1, 0);
    for(i=1; i<=n; i++)
        sol=max(sol, ans[i]);
    printf("%d\n", sol);
    return 0;
}