Submission #689353

# Submission time Handle Problem Language Result Execution time Memory
689353 2023-01-28T09:37:25 Z 600Mihnea Dynamic Diameter (CEOI19_diameter) C++17
49 / 100
5000 ms 114960 KB
bool home = 0;
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll INF = (ll)1e18 + 7;


struct SegmentTree {
  vector<ll> tree;
  vector<ll> lazy;
  int n;

  void init(int nn) {
    n = nn;
    tree.resize(2 * (n + 7), 0);
    lazy.resize(2 * (n + 7), 0);
  }

  void add(int v, int tl, int tr, int l, int r, ll x) {
    if (tr < l || r < tl) {
      return;
    }
    if (l <= tl && tr <= r) {
      tree[v] += x;
      lazy[v] += x;
      return;
    }
    int tm = (tl + tr) / 2;
    add(v + 1, tl, tm, l, r, x);
    add(v + 2 * (tm - tl + 1), tm + 1, tr, l, r, x);
    tree[v] = max(tree[v + 1], tree[v + 2 * (tm - tl + 1)]) + lazy[v];
  }

  ll getmax(int v, int tl, int tr, int l, int r) {
    if (tr < l || r < tl) {
      return -INF;
    }
    if (l <= tl && tr <= r) {
      return tree[v];
    }
    int tm = (tl + tr) / 2;
    return max(getmax(v + 1, tl, tm, l, r), getmax(v + 2 * (tm - tl + 1), tm + 1, tr, l, r)) + lazy[v];
  }

  void add(int l, int r, ll x) {
    add(1, 1, n, l, r, x);
  }

  ll getmax(int l, int r) {
    return getmax(1, 1, n, l, r);
  }
};

const int N = (int)1e5 + 7;
const int K = 20;
int n;
int q;
ll w;
int sum_edge[N];
ll val_edge[N];
vector<int> gindex[N];
SegmentTree trees[K];
bool blocked[N];
int sub[N];
int total_under;

void build_sub(int a, int p = -1) {
  sub[a] = 1;
  for (auto& I : gindex[a]) {
    int b = sum_edge[I] - a;
    if (b == p || blocked[b]) {
      continue;
    }
    build_sub(b, a);
    sub[a] += sub[b];
  }
}

int fcen(int a, int p = -1) {
  int mx = total_under - sub[a];
  for (auto& I : gindex[a]) {
    int b = sum_edge[I] - a;
    if (b == p || blocked[b]) {
      continue;
    }
    mx = max(mx, sub[b]);
  }
  if (mx <= total_under / 2) {
    return a;
  }
  for (auto& I : gindex[a]) {
    int b = sum_edge[I] - a;
    if (b == p || blocked[b]) {
      continue;
    }
    if (mx == sub[b]) {
      return fcen(b, a);
    }
  }
}

int low[K][N];
int high[K][N];
int ord[K][N];
int where[K][N];
int vrt[K][N];
int top[K];

vector<ll> all;
vector<int> where2;
vector<pair<int, int>> seg;
vector<multiset<ll>> s;
int kek = -1;
int kek2 = -1;

multiset<int> tog;

void prep(int a, int p, int level) {
  sub[a] = 1;
  ord[level][++top[level]] = a;
  low[level][a] = top[level];
  for (auto& I : gindex[a]) {
    int b = sum_edge[I] - a;
    if (b == p || blocked[b]) {
      continue;
    }
    where[level][I] = kek;
    vrt[level][I] = b;
    prep(b, a, level);
    sub[a] += sub[b];
  }
  high[level][a] = top[level];
}

void add(int i, ll delta) {
  for (int level = 0; level < K; level++) {
    if (level != 0) {
      ///continue; /// delete this line urgently !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    }
    if (where[level][i] == -1) {
      continue;
    }
    int b = vrt[level][i];
    int l = low[level][b], r = high[level][b];

    {
      ll cur = 0;
      if ((int)s[where2[where[level][i]]].size() == 0) {}
      else
        if ((int)s[where2[where[level][i]]].size() == 1) {
          cur = *s[where2[where[level][i]]].begin();
        }
        else {
          auto it = s[where2[where[level][i]]].end();
          it--;
          cur += *it;
          it--;
          cur += *it;
        }
      if (tog.find(cur) != tog.end()) {
        tog.erase(tog.find(cur));
      }
    }
    s[where2[where[level][i]]].erase(s[where2[where[level][i]]].find(trees[level].getmax(seg[where[level][i]].first, seg[where[level][i]].second)));
    trees[level].add(l, r, delta);
    all[where[level][i]] = trees[level].getmax(seg[where[level][i]].first, seg[where[level][i]].second);
    s[where2[where[level][i]]].insert(trees[level].getmax(seg[where[level][i]].first, seg[where[level][i]].second));

    {
      ll cur = 0;
      if ((int)s[where2[where[level][i]]].size() == 0) {}
      else
        if ((int)s[where2[where[level][i]]].size() == 1) {
          cur = *s[where2[where[level][i]]].begin();
        }
        else {
          auto it = s[where2[where[level][i]]].end();
          it--;
          cur += *it;
          it--;
          cur += *it;
        }
      tog.insert(cur);
    }

  }
}

void build_centroid(int a, int level) {
  assert(level < 20);
  build_sub(a);
  total_under = sub[a];
  a = fcen(a);
  blocked[a] = 1;

  kek2++;
  s.push_back({});

  for (auto& I : gindex[a]) {
    int b = sum_edge[I] - a;
    if (blocked[b]) {
      continue;
    }

    kek++;
    all.push_back(0);
    vrt[level][I] = b;
    where[level][I] = kek;
    prep(b, a, level);
    seg.push_back({ low[level][b], high[level][b] });
    where2.push_back(kek2);
    s.back().insert(0);
  }

  for (auto& I : gindex[a]) {
    int b = sum_edge[I] - a;
    if (blocked[b]) {
      continue;
    }
    build_centroid(b, level + 1);
  }
}

ll get_diam() {
  ll sol = 0;
  for (auto& s2 : s) {
    auto it = s2.end();
    ll cur = 0;
    it--;
    cur += *it;
    it--;
    cur += *it;
    sol = max(sol, cur);
  }
  return sol;
}

int xx[N], yy[N];

int main() {
  if (home == 0) {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  }
  else {
    freopen("input.txt", "r", stdin);
  }
  cin >> n >> q >> w;
  for (int i = 0; i < K; i++) {
    for (int j = 0; j < N; j++) {
      where[i][j] = -1;
    }
    trees[i].init(n);
  }
  for (int i = 1; i < n; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    xx[i] = a;
    yy[i] = b;
    sum_edge[i] = a + b;
    gindex[a].push_back(i);
    gindex[b].push_back(i);
    val_edge[i] = c;
  }
  build_centroid(1, 0);
  for (int i = 1; i < n; i++) {
    add(i, val_edge[i]);
  }
  ll last = 0;
  for (int iq = 1; iq <= q; iq++) {
    int d, e;
    cin >> d >> e;
    d = (d + last) % (n - 1) + 1;
    e = (e + last) % w;
    add(d, -val_edge[d] + e);
    val_edge[d] = e;
    if (tog.empty()) {
      last = 0;
    }
    else {
      auto it = tog.end();
      it--;
      last = *it;
    }

    cout << last << "\n";

  }
  return 0;
}

Compilation message

diameter.cpp: In function 'int fcen(int, int)':
diameter.cpp:102:1: warning: control reaches end of non-void function [-Wreturn-type]
  102 | }
      | ^
diameter.cpp: In function 'int main()':
diameter.cpp:247:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  247 |     freopen("input.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 6 ms 10580 KB Output is correct
2 Correct 5 ms 10580 KB Output is correct
3 Correct 5 ms 10580 KB Output is correct
4 Correct 5 ms 10580 KB Output is correct
5 Correct 6 ms 10580 KB Output is correct
6 Correct 5 ms 10588 KB Output is correct
7 Correct 5 ms 10640 KB Output is correct
8 Correct 5 ms 10580 KB Output is correct
9 Correct 6 ms 10580 KB Output is correct
10 Correct 8 ms 10580 KB Output is correct
11 Correct 5 ms 10580 KB Output is correct
12 Correct 6 ms 10580 KB Output is correct
13 Correct 6 ms 10708 KB Output is correct
14 Correct 5 ms 10708 KB Output is correct
15 Correct 5 ms 10640 KB Output is correct
16 Correct 5 ms 10708 KB Output is correct
17 Correct 6 ms 10708 KB Output is correct
18 Correct 7 ms 10656 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 10580 KB Output is correct
2 Correct 5 ms 10580 KB Output is correct
3 Correct 5 ms 10580 KB Output is correct
4 Correct 5 ms 10580 KB Output is correct
5 Correct 6 ms 10580 KB Output is correct
6 Correct 5 ms 10588 KB Output is correct
7 Correct 5 ms 10640 KB Output is correct
8 Correct 5 ms 10580 KB Output is correct
9 Correct 6 ms 10580 KB Output is correct
10 Correct 8 ms 10580 KB Output is correct
11 Correct 5 ms 10580 KB Output is correct
12 Correct 6 ms 10580 KB Output is correct
13 Correct 6 ms 10708 KB Output is correct
14 Correct 5 ms 10708 KB Output is correct
15 Correct 5 ms 10640 KB Output is correct
16 Correct 5 ms 10708 KB Output is correct
17 Correct 6 ms 10708 KB Output is correct
18 Correct 7 ms 10656 KB Output is correct
19 Correct 31 ms 11644 KB Output is correct
20 Correct 37 ms 11672 KB Output is correct
21 Correct 36 ms 11800 KB Output is correct
22 Correct 46 ms 11736 KB Output is correct
23 Correct 69 ms 15444 KB Output is correct
24 Correct 86 ms 15684 KB Output is correct
25 Correct 105 ms 15800 KB Output is correct
26 Correct 118 ms 16232 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 10580 KB Output is correct
2 Correct 5 ms 10452 KB Output is correct
3 Correct 6 ms 10580 KB Output is correct
4 Correct 17 ms 10580 KB Output is correct
5 Correct 62 ms 10916 KB Output is correct
6 Correct 5 ms 10452 KB Output is correct
7 Correct 6 ms 10964 KB Output is correct
8 Correct 6 ms 10964 KB Output is correct
9 Correct 8 ms 10996 KB Output is correct
10 Correct 24 ms 10988 KB Output is correct
11 Correct 87 ms 11444 KB Output is correct
12 Correct 12 ms 14872 KB Output is correct
13 Correct 12 ms 15000 KB Output is correct
14 Correct 14 ms 14872 KB Output is correct
15 Correct 34 ms 14872 KB Output is correct
16 Correct 121 ms 15272 KB Output is correct
17 Correct 186 ms 94312 KB Output is correct
18 Correct 194 ms 94260 KB Output is correct
19 Correct 198 ms 94196 KB Output is correct
20 Correct 229 ms 94248 KB Output is correct
21 Correct 488 ms 94288 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 11648 KB Output is correct
2 Correct 48 ms 11660 KB Output is correct
3 Correct 205 ms 11960 KB Output is correct
4 Correct 379 ms 12164 KB Output is correct
5 Correct 104 ms 20788 KB Output is correct
6 Correct 169 ms 20804 KB Output is correct
7 Correct 468 ms 20984 KB Output is correct
8 Correct 843 ms 21392 KB Output is correct
9 Correct 663 ms 61916 KB Output is correct
10 Correct 771 ms 61968 KB Output is correct
11 Correct 1293 ms 62232 KB Output is correct
12 Correct 1859 ms 62456 KB Output is correct
13 Correct 1445 ms 114244 KB Output is correct
14 Correct 1609 ms 114372 KB Output is correct
15 Correct 2275 ms 114584 KB Output is correct
16 Correct 3097 ms 114856 KB Output is correct
17 Correct 4869 ms 114960 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 5051 ms 76744 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 6 ms 10580 KB Output is correct
2 Correct 5 ms 10580 KB Output is correct
3 Correct 5 ms 10580 KB Output is correct
4 Correct 5 ms 10580 KB Output is correct
5 Correct 6 ms 10580 KB Output is correct
6 Correct 5 ms 10588 KB Output is correct
7 Correct 5 ms 10640 KB Output is correct
8 Correct 5 ms 10580 KB Output is correct
9 Correct 6 ms 10580 KB Output is correct
10 Correct 8 ms 10580 KB Output is correct
11 Correct 5 ms 10580 KB Output is correct
12 Correct 6 ms 10580 KB Output is correct
13 Correct 6 ms 10708 KB Output is correct
14 Correct 5 ms 10708 KB Output is correct
15 Correct 5 ms 10640 KB Output is correct
16 Correct 5 ms 10708 KB Output is correct
17 Correct 6 ms 10708 KB Output is correct
18 Correct 7 ms 10656 KB Output is correct
19 Correct 31 ms 11644 KB Output is correct
20 Correct 37 ms 11672 KB Output is correct
21 Correct 36 ms 11800 KB Output is correct
22 Correct 46 ms 11736 KB Output is correct
23 Correct 69 ms 15444 KB Output is correct
24 Correct 86 ms 15684 KB Output is correct
25 Correct 105 ms 15800 KB Output is correct
26 Correct 118 ms 16232 KB Output is correct
27 Correct 5 ms 10580 KB Output is correct
28 Correct 5 ms 10452 KB Output is correct
29 Correct 6 ms 10580 KB Output is correct
30 Correct 17 ms 10580 KB Output is correct
31 Correct 62 ms 10916 KB Output is correct
32 Correct 5 ms 10452 KB Output is correct
33 Correct 6 ms 10964 KB Output is correct
34 Correct 6 ms 10964 KB Output is correct
35 Correct 8 ms 10996 KB Output is correct
36 Correct 24 ms 10988 KB Output is correct
37 Correct 87 ms 11444 KB Output is correct
38 Correct 12 ms 14872 KB Output is correct
39 Correct 12 ms 15000 KB Output is correct
40 Correct 14 ms 14872 KB Output is correct
41 Correct 34 ms 14872 KB Output is correct
42 Correct 121 ms 15272 KB Output is correct
43 Correct 186 ms 94312 KB Output is correct
44 Correct 194 ms 94260 KB Output is correct
45 Correct 198 ms 94196 KB Output is correct
46 Correct 229 ms 94248 KB Output is correct
47 Correct 488 ms 94288 KB Output is correct
48 Correct 14 ms 11648 KB Output is correct
49 Correct 48 ms 11660 KB Output is correct
50 Correct 205 ms 11960 KB Output is correct
51 Correct 379 ms 12164 KB Output is correct
52 Correct 104 ms 20788 KB Output is correct
53 Correct 169 ms 20804 KB Output is correct
54 Correct 468 ms 20984 KB Output is correct
55 Correct 843 ms 21392 KB Output is correct
56 Correct 663 ms 61916 KB Output is correct
57 Correct 771 ms 61968 KB Output is correct
58 Correct 1293 ms 62232 KB Output is correct
59 Correct 1859 ms 62456 KB Output is correct
60 Correct 1445 ms 114244 KB Output is correct
61 Correct 1609 ms 114372 KB Output is correct
62 Correct 2275 ms 114584 KB Output is correct
63 Correct 3097 ms 114856 KB Output is correct
64 Correct 4869 ms 114960 KB Output is correct
65 Execution timed out 5051 ms 76744 KB Time limit exceeded
66 Halted 0 ms 0 KB -