Submission #645960

#TimeUsernameProblemLanguageResultExecution timeMemory
645960dattranxxxConstruction of Highway (JOI18_construction)C++11
100 / 100
361 ms110524 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 5;
vector<int> adj[N];
int a[N], c[N];
int n;
int siz[N], par[N], dep[N];
int size(int u) {
  siz[u] = 1;
  for (int& v : adj[u]) {
    adj[v].erase(find(adj[v].begin(), adj[v].end(), u));
    par[v] = u, dep[v] = dep[u] + 1;
    siz[u] += size(v);
    if (siz[v] > siz[adj[u][0]])
      swap(v, adj[u][0]);
  }
  return siz[u];
}

int nxt[N];
void hld(int u) {
  for (int v : adj[u]) {
    nxt[v] = v == adj[u][0] ? nxt[u] : v;
    hld(v);
  }
}
int m;
int bit[N];
int cnt(int i) {
  int res = 0;
  for (; i; i -= i & -i)
    res += bit[i];
  return res;
}

void add(int i, int x) {
  for (; i <= m; i += i & -i)
    bit[i] += x;
}

#define Tp pair<int, int>
#define fi first
#define se second
deque<Tp> seq[N];

ll get(int u) {
  vector<Tp> cur;
  for (int v = u; ~v; v = par[nxt[v]]) {
    int len = dep[v] - dep[nxt[v]] + 1;
    vector<Tp> tmp;
    for (auto& p : seq[nxt[v]]) {
      if (len >= p.se)
        len -= p.se, tmp.emplace_back(p);
      else {
        tmp.emplace_back(p);
        tmp.back().se = len; break;
      }
    }
    reverse(tmp.begin(), tmp.end());
    for (auto& p : tmp) cur.emplace_back(p);
  }
  ll res = 0;
  for (auto& p : cur) 
    res += p.se * cnt(p.fi - 1), add(p.fi, p.se);
  for (auto& p : cur) add(p.fi, -p.se);
  return res;
}

void update(int u) {
  for (int v = u; ~v; v = par[nxt[v]]) {
    int len = dep[v] - dep[nxt[v]] + 1;
    while (!seq[nxt[v]].empty()) {
      if (len >= seq[nxt[v]].front().se)
        len -= seq[nxt[v]].front().se, seq[nxt[v]].pop_front();
      else {
        seq[nxt[v]].front().se -= len; break;
      }
    }
    seq[nxt[v]].emplace_front(a[u], dep[v] - dep[nxt[v]] + 1);
  }
}

int main() {
  cin.tie(0)->sync_with_stdio(0); cout.tie(0);
  cin >> n;
  for (int i = 0; i < n; ++i)
    cin >> a[i], c[i] = a[i];
  sort(c, c + n); m = unique(c, c + n) - c;
  for (int i = 0; i < n; ++i)
    a[i] = lower_bound(c, c + m, a[i]) - c + 1;
  vector<pair<int, int>> edges;
  for (int i = 0, u, v; i < n-1; ++i)
    cin >> u >> v, u--, v--,
    adj[u].emplace_back(v),
    adj[v].emplace_back(u),
    edges.emplace_back(u, v);
  par[0] = -1, size(0), hld(0);
  update(0);
  for (int i = 0, u, v; i < n-1; ++i) {
    tie(u, v) = edges[i];
    cout << get(u) << '\n';
    update(v);
  }
	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...