Submission #1234650

#TimeUsernameProblemLanguageResultExecution timeMemory
1234650LucaIlieTree (IOI24_tree)C++20
0 / 100
58 ms21412 KiB
#include "tree.h"
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 2e5;
int n;
int parent[MAX_N], w[MAX_N], perm[MAX_N];
int sef[MAX_N], leaves[MAX_N], minW[MAX_N];
long long coefL[MAX_N], coefR[MAX_N];
vector<int> adj[MAX_N];

int findSef(int v) {
  if (sef[v] != v)
    sef[v] = findSef(sef[v]);
  return sef[v];
}

void init(vector<int> P, vector<int> W) {
  n = (int)W.size();
  for (int v = 0; v < n; v++) {
    parent[v] = P[v];
    if (v != 0)
      adj[parent[v]].push_back(v);
    w[v] = W[v];
  }

  for (int i = 0; i < n; i++)
    perm[i] = i;
  sort(perm, perm + n, [](int u, int v) { return w[u] < w[v]; });

  for (int v = 0; v < n; v++) {
    sef[v] = v;
    leaves[v] = 1;
    minW[v] = w[v];
  }

  for (int i = n - 1; i >= 0; i--) {
    int u = perm[i];
    if (adj[u].empty()) {
      coefL[n] += w[u];
      continue;
    }

    int a = findSef(u);
    for (int v : adj[u]) {
      int b = findSef(v);
      sef[b] = a;
      leaves[a] += leaves[b];
      coefL[leaves[b]] += (long long)(minW[b] - w[u]) * leaves[b];
      coefR[leaves[b]] -= minW[b] - w[u];
    }
    minW[a] = w[u];
    leaves[a]--;
  }
  coefL[leaves[0]] += (long long)minW[0] * leaves[0];
  coefR[leaves[0]] -= minW[0];

  for (int i = n - 1; i >= 0; i--) {
    coefL[i] += coefL[i + 1];
    coefR[i] += coefR[i + 1];
  }
}

long long query(int l, int r) {
  int k = min(n, (int)ceil((double)r / l));
  return l * coefL[k] + r * coefR[k];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...