Submission #999730

#TimeUsernameProblemLanguageResultExecution timeMemory
999730vjudge1Construction of Highway (JOI18_construction)C++17
16 / 100
2055 ms23748 KiB
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set =
    tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

const int N = 100'010;
const int LG = 20;
int up[N][LG], depth[N], n, sz[N];
vector<int> g[N];
int c[N];
void dfs(int at, int p) {
  up[at][0] = p;
  sz[at]=1;
  for(int i = 1;i < LG;i++) {
    up[at][i] = up[up[at][i-1]][i-1];
  }
  for(int to:g[at]) {
    if(to == p)continue;
    depth[to] = depth[at]+1;
    dfs(to, at);
    sz[at]+=sz[to];
  }
}
int lca(int a, int b) {
  if(depth[a] < depth[b])swap(a, b);
  int k = depth[a] - depth[b];
  for(int i = LG-1;i>=0;i--) {
    if(k&(1<<i)) {
      a = up[a][i];
    }
  }
  if(a==b)return a;
  for(int i = LG-1;i>=0;i--) {
    if(up[a][i] != up[b][i]) {
      a=up[a][i];
      b=up[b][i];
    }
  }
  return up[a][0];
}
int main () {
  cin.tie(0)->sync_with_stdio(0);
  cin >> n;
  for(int i = 1;i<=n;i++)cin >> c[i];
  vector<pair<int,int>> e;
  for(int i = 1;i<n;i++) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
    e.push_back({a, b});
  }
  dfs(1, 0);
  int cnt=0;
  for(auto [a, b]:e) {
    int ans = 0;
    ordered_set<int> s;
    int cur=a;
    int prev =0;
    do {
      ans+=s.order_of_key(c[cur]);
      if(c[cur] != prev) {
        cnt++;
        prev = c[cur];
      }
      s.insert(c[cur]);
      cur = up[cur][0];
    }while(cur!=0);
    cur=a;
    do {
      c[cur] = c[b];
      cur = up[cur][0];
    }while(cur!=0);
    cout << ans << "\n";
  }
  assert(cnt <= max(100, n*50));
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...