제출 #1286223

#제출 시각아이디문제언어결과실행 시간메모리
1286223lmquanJanjetina (COCI21_janjetina)C++20
110 / 110
257 ms17156 KiB
#define taskname ""
#include <bits/stdc++.h>
using namespace std;
const int kMaxNW = 100005;

struct FenwickTree {
  int x;
  vector<int> bit;

  FenwickTree(int _x) : x(_x) {
    bit.resize(x + 2, 0);
  }

  void Update(int p, int d) {
    p++;
    for (int i = p; i <= x; i += i & (-i)) {
      bit[i] += d;
    }
  }

  int PrefixSum(int p) {
    p++;
    int s = 0;
    for (int i = p; i > 0; i -= i & (-i)) {
      s += bit[i];
    }
    return s;
  }
};

int n, k, sz[kMaxNW];
long long cnt;
bool deleted[kMaxNW];
vector<pair<int, int>> adj[kMaxNW];
FenwickTree a(kMaxNW);

int DFS1(int u, int p) {
  sz[u] = 1;
  for (auto i : adj[u]) {
    int v = i.first;
    if (v == p || deleted[v]) {
      continue;
    }
    DFS1(v, u);
    sz[u] += sz[v];
  }
  return sz[u];
}

int FindCentroid(int u, int p, int m) {
  for (auto i : adj[u]) {
    int v = i.first;
    if (v == p || deleted[v]) {
      continue;
    }
    if (sz[v] > m / 2) {
      return FindCentroid(v, u, m);
    }
  }
  return u;
}

struct T {
  int v, d, mw;
};

void DFS2(int u, int p, int depth, int max_weight, vector<T>& S) {
  S.push_back({u, depth, max_weight});
  for (auto i : adj[u]) {
    int v = i.first, w = i.second;
    if (v == p || deleted[v]) {
      continue;
    }
    DFS2(v, u, depth + 1, max(max_weight, w), S);
  }
}

void CentroidDecomposition(int u) {
  int g = DFS1(u, -1), c = FindCentroid(u, -1, g);
  deleted[c] = true;

  vector<T> S;
  DFS2(c, -1, 0, 0, S);
  sort(S.begin(), S.end(), [](T x, T y) {
    return x.mw < y.mw;
  });
  for (int i = 0; i < S.size(); i++) {
    if (S[i].mw - S[i].d - k >= 0) {
      cnt += a.PrefixSum(S[i].mw - S[i].d - k);
    }
    a.Update(S[i].d, 1);
  }
  for (int i = 0; i < S.size(); i++) {
    a.Update(S[i].d, -1);
  }

  for (auto i : adj[c]) {
    int v = i.first, w = i.second;
    if (deleted[v]) {
      continue;
    }
    vector<T> M;
    DFS2(v, c, 1, w, M);
    sort(M.begin(), M.end(), [](T x, T y) {
      return x.mw < y.mw;
    });
    for (int i = 0; i < M.size(); i++) {
      if (M[i].mw - M[i].d - k >= 0) {
        cnt -= a.PrefixSum(M[i].mw - M[i].d - k);
      }
      a.Update(M[i].d, 1);
    }
    for (int i = 0; i < M.size(); i++) {
      a.Update(M[i].d, -1);
    }
  }

  for (auto i : adj[c]) {
    int v = i.first;
    if (deleted[v]) {
      continue;
    }
    CentroidDecomposition(v);
  }
}

int main() {
  if (fopen(taskname".inp", "r")) {
    freopen(taskname".inp", "r", stdin);
    freopen(taskname".out", "w", stdout);
  }
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  cin >> n >> k;
  for (int i = 1; i < n; i++) {
    int x, y, w;
    cin >> x >> y >> w;
    adj[x].push_back({y, w});
    adj[y].push_back({x, w});
  }

  int root = 1;
  CentroidDecomposition(root);

  cout << 2 * cnt;

  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:129:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  129 |     freopen(taskname".inp", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:130:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  130 |     freopen(taskname".out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...