Cod sursa(job #2230576)

Utilizator GoogalAbabei Daniel Googal Data 10 august 2018 17:37:01
Problema Guvern Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>
#include <stack>
#include <set>

using namespace std;

ifstream in("guvern.in");
ofstream out("guvern.out");

const int NMAX = 1e5 + 1e2;
const int INF = 1 << 31;

int n, x, y;
int res;
int dp[NMAX], val[NMAX];
bool fst[NMAX];

vector < int > v[NMAX];
vector < int > w[NMAX][2];
stack < int, vector < int > > son[NMAX];
set < pair < int , int > > q;

int src(int node, int s) {
  int cur = 0;
  for(int i = 0; i < (int)w[node][s].size(); i++)
    cur += src(w[node][s][i], 0);

  return max(dp[node], cur);
}

void dfs(int node) {
  fst[node] = 1;
  set < pair < int, int > > :: iterator it = q.upper_bound(make_pair(val[node], 0));

  if(son[it->second].size() == 0)
    w[it->second][1].push_back(node);
  else
    w[son[it->second].top()][0].push_back(node);

  son[it->second].push(node);
  q.insert(make_pair(val[node], node));

  for(int i = 0; i < v[node].size(); i++)
    if(!fst[v[node][i] ])
      dfs(v[node][i]);

  q.erase(make_pair(val[node], node));
  son[it->second].pop();

  dp[node] = src(node, 1) + 1;
}

int main()
{
  in >> n;

  for(int i = 1; i < n; i++) {
    int x, y;
    in >> x >> y;

    v[x].push_back(y);
    v[y].push_back(x);
  }

  for(int i = 1; i <= n; i++)
    in >> val[i];

  val[0] = INF;

  v[0].push_back(1);
  v[1].push_back(0);

  dfs(0);
  out << dp[0] << '\n';

  in.close();
  out.close();

  return 0;
}