Submission #531156

# Submission time Handle Problem Language Result Execution time Memory
531156 2022-02-27T21:33:59 Z Alex_tz307 Dynamic Diameter (CEOI19_diameter) C++17
100 / 100
4878 ms 367204 KB
#include <bits/stdc++.h>

using namespace std;

const int kN = 1e5;
multiset<int64_t> diameters;

void maxSelf(int64_t &x, int64_t y) {
  if (x < y) {
    x = y;
  }
}

struct Centroid {
  int n, root, timer;
  vector<int> nodes, tin, tout, child;
  vector<tuple<int, int, int64_t>> edges;
  vector<vector<int>> g;
  vector<int64_t> wt, dp, maxDist, dpLin;
  multiset<int64_t> paths;

  struct ST {
    int n;
    vector<int64_t> t, lazy, dp;

    void init(int N, const vector<int64_t> &aux) {
      n = N;
      int dim = 1;
      while (dim < n) {
        dim *= 2;
      }
      dim *= 2;
      t.resize(dim);
      lazy.resize(dim);
      dp = aux;
    }

    void build(int x, int lx, int rx) {
      if (lx == rx) {
        t[x] = dp[lx];
        return;
      }
      int mid = (lx + rx) / 2;
      build(x * 2, lx, mid);
      build(x * 2 + 1, mid + 1, rx);
      t[x] = max(t[x * 2], t[x * 2 + 1]);
    }

    void updateNode(int x, int64_t v) {
      t[x] += v;
      lazy[x] += v;
    }

    void push(int x) {
      if (lazy[x] == 0) {
        return;
      }
      for (int i = 0; i < 2; ++i) {
        updateNode(x * 2 + i, lazy[x]);
      }
      lazy[x] = 0;
    }

    void update(int x, int lx, int rx, int st, int dr, int64_t v) {
      if (st <= lx && rx <= dr) {
        updateNode(x, v);
        return;
      }
      push(x);
      int mid = (lx + rx) / 2;
      if (st <= mid) {
        update(x * 2, lx, mid, st, dr, v);
      }
      if (mid < dr) {
        update(x * 2 + 1, mid + 1, rx, st, dr, v);
      }
      t[x] = max(t[x * 2], t[x * 2 + 1]);
    }

    void update(int st, int dr, int64_t v) {
      update(1, 1, n, st, dr, v);
    }

    int64_t query(int x, int lx, int rx, int st, int dr) {
      if (st <= lx && rx <= dr) {
        return t[x];
      }
      push(x);
      int mid = (lx + rx) / 2;
      int64_t ans = 0;
      if (st <= mid) {
        maxSelf(ans, query(x * 2, lx, mid, st, dr));
      }
      if (mid < dr) {
        maxSelf(ans, query(x * 2 + 1, mid + 1, rx, st, dr));
      }
      return ans;
    }

    int64_t query(int st, int dr) {
      return query(1, 1, n, st, dr);
    }
  } t;

  void setRoot(int v) {
    root = v;
  }

  void addNode(int v) {
    nodes.emplace_back(v);
  }

  void addEdge(int u, int v, int64_t w) {
    edges.emplace_back(u, v, w);
  }

  int getIndex(int v) {
    return distance(nodes.begin(), upper_bound(nodes.begin(), nodes.end(), v));
  }

  void dfs(int u, int par) {
    tin[u] = ++timer;
    maxDist[u] = dp[u];
    for (int v : g[u]) {
      if (v != par) {
        if (par == 0) {
          child[v] = v;
        } else {
          child[v] = child[u];
        }
        dp[v] = dp[u] + wt[v];
        dfs(v, u);
        maxSelf(maxDist[u], maxDist[v]);
      }
    }
    tout[u] = timer;
  }

  int64_t getDiameter() {
    auto it = paths.end();
    --it;
    int64_t len = *it;
    if ((int)paths.size() >= 2) {
      --it;
      len += *it;
    }
    return len;
  }

  void addDiameter() {
    diameters.emplace(getDiameter());
  }

  void removeDiameter() {
    diameters.erase(diameters.find(getDiameter()));
  }

  void build() {
    sort(nodes.begin(), nodes.end());
    root = getIndex(root);
    n = nodes.size();
    g.resize(n + 1);
    wt.resize(n + 1);
    for (auto it : edges) {
      int u, v;
      int64_t w;
      tie(u, v, w) = it;
      u = getIndex(u);
      v = getIndex(v);
      g[u].emplace_back(v);
      wt[v] = w;
    }
    timer = 0;
    tin.resize(n + 1);
    tout.resize(n + 1);
    dp.resize(n + 1);
    maxDist.resize(n + 1);
    child.resize(n + 1);
    dfs(root, 0);
    dpLin.resize(n + 1);
    for (int v = 1; v <= n; ++v) {
      dpLin[tin[v]] = dp[v];
    }
    t.init(n, dpLin);
    t.build(1, 1, n);
    for (int v : g[root]) {
      paths.emplace(maxDist[v]);
    }
    addDiameter();
  }

  void updateEdge(int v, int64_t w) {
    removeDiameter();
    v = getIndex(v);
    int son = child[v];
    paths.erase(paths.find(t.query(tin[son], tout[son])));
    t.update(tin[v], tout[v], w - wt[v]);
    wt[v] = w;
    paths.emplace(t.query(tin[son], tout[son]));
    addDiameter();
  }
} C[1 + kN];

int sz[1 + kN];
vector<pair<int, int64_t>> g[1 + kN];
pair<int, int> edges[1 + kN];
bitset<1 + kN> vis;
map<pair<int, int>, vector<int>> centroids;

void findSize(int u, int par) {
  sz[u] = 1;
  for (auto it : g[u]) {
    int v = it.first;
    if (!vis[v] && v != par) {
      findSize(v, u);
      sz[u] += sz[v];
    }
  }
}

int findCentroid(int u, int par, int n) {
  for (auto it : g[u]) {
    int v = it.first;
    if (!vis[v] && v != par && sz[v] > n / 2) {
      return findCentroid(v, u, n);
    }
  }
  return u;
}

void dfs(int u, int par, int centroid) {
  if (par) {
    centroids[{par, u}].emplace_back(centroid);
  }
  C[centroid].addNode(u);
  for (auto it : g[u]) {
    int v;
    int64_t w;
    tie(v, w) = it;
    if (!vis[v] && v != par) {
      C[centroid].addEdge(u, v, w);
      dfs(v, u, centroid);
    }
  }
}

void build(int u) {
  findSize(u, 0);
  if (sz[u] == 1) {
    return;
  }
  int c = findCentroid(u, 0, sz[u]);
  vis[c] = true;
  C[c].setRoot(c);
  dfs(c, 0, c);
  C[c].build();
  for (auto it : g[c]) {
    int v = it.first;
    if (!vis[v]) {
      build(v);
    }
  }
}

void testCase() {
  int n, q;
  int64_t W;
  cin >> n >> q >> W;
  for (int i = 1; i < n; ++i) {
    int u, v;
    int64_t w;
    cin >> u >> v >> w;
    g[u].emplace_back(v, w);
    g[v].emplace_back(u, w);
    edges[i] = {u, v};
  }
  build(1);
  int64_t last = 0;
  for (int i = 1; i <= q; ++i) {
    int d;
    int64_t w;
    cin >> d >> w;
    d = (last + d) % (n - 1);
    w = (last + w) % W;
    d += 1;
    int u, v;
    tie(u, v) = edges[d];
    for (int c : centroids[{u, v}]) {
      C[c].updateEdge(v, w);
    }
    for (int c : centroids[{v, u}]) {
      C[c].updateEdge(u, w);
    }
    last = *diameters.rbegin();
    cout << last << '\n';
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int tests = 1;
  for (int tc = 0; tc < tests; ++tc) {
    testCase();
  }
  return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 19 ms 40140 KB Output is correct
2 Correct 20 ms 40140 KB Output is correct
3 Correct 19 ms 40140 KB Output is correct
4 Correct 19 ms 40140 KB Output is correct
5 Correct 18 ms 40188 KB Output is correct
6 Correct 19 ms 40144 KB Output is correct
7 Correct 19 ms 40244 KB Output is correct
8 Correct 18 ms 40268 KB Output is correct
9 Correct 20 ms 40252 KB Output is correct
10 Correct 19 ms 40272 KB Output is correct
11 Correct 18 ms 40236 KB Output is correct
12 Correct 22 ms 40308 KB Output is correct
13 Correct 20 ms 40220 KB Output is correct
14 Correct 25 ms 40260 KB Output is correct
15 Correct 20 ms 40244 KB Output is correct
16 Correct 20 ms 40240 KB Output is correct
17 Correct 21 ms 40316 KB Output is correct
18 Correct 20 ms 40356 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 40140 KB Output is correct
2 Correct 20 ms 40140 KB Output is correct
3 Correct 19 ms 40140 KB Output is correct
4 Correct 19 ms 40140 KB Output is correct
5 Correct 18 ms 40188 KB Output is correct
6 Correct 19 ms 40144 KB Output is correct
7 Correct 19 ms 40244 KB Output is correct
8 Correct 18 ms 40268 KB Output is correct
9 Correct 20 ms 40252 KB Output is correct
10 Correct 19 ms 40272 KB Output is correct
11 Correct 18 ms 40236 KB Output is correct
12 Correct 22 ms 40308 KB Output is correct
13 Correct 20 ms 40220 KB Output is correct
14 Correct 25 ms 40260 KB Output is correct
15 Correct 20 ms 40244 KB Output is correct
16 Correct 20 ms 40240 KB Output is correct
17 Correct 21 ms 40316 KB Output is correct
18 Correct 20 ms 40356 KB Output is correct
19 Correct 40 ms 41540 KB Output is correct
20 Correct 41 ms 41660 KB Output is correct
21 Correct 46 ms 41932 KB Output is correct
22 Correct 49 ms 42140 KB Output is correct
23 Correct 93 ms 47300 KB Output is correct
24 Correct 93 ms 49472 KB Output is correct
25 Correct 93 ms 50592 KB Output is correct
26 Correct 99 ms 53120 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 40220 KB Output is correct
2 Correct 22 ms 40180 KB Output is correct
3 Correct 20 ms 40260 KB Output is correct
4 Correct 32 ms 40436 KB Output is correct
5 Correct 83 ms 41288 KB Output is correct
6 Correct 20 ms 40212 KB Output is correct
7 Correct 21 ms 40408 KB Output is correct
8 Correct 20 ms 40396 KB Output is correct
9 Correct 25 ms 40472 KB Output is correct
10 Correct 38 ms 40656 KB Output is correct
11 Correct 113 ms 41660 KB Output is correct
12 Correct 22 ms 42052 KB Output is correct
13 Correct 23 ms 42060 KB Output is correct
14 Correct 26 ms 42208 KB Output is correct
15 Correct 50 ms 42724 KB Output is correct
16 Correct 177 ms 43932 KB Output is correct
17 Correct 121 ms 76860 KB Output is correct
18 Correct 128 ms 76852 KB Output is correct
19 Correct 137 ms 76888 KB Output is correct
20 Correct 187 ms 77840 KB Output is correct
21 Correct 606 ms 83472 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 41676 KB Output is correct
2 Correct 52 ms 41932 KB Output is correct
3 Correct 185 ms 42388 KB Output is correct
4 Correct 333 ms 43236 KB Output is correct
5 Correct 87 ms 60544 KB Output is correct
6 Correct 138 ms 60692 KB Output is correct
7 Correct 380 ms 61720 KB Output is correct
8 Correct 714 ms 62528 KB Output is correct
9 Correct 404 ms 157996 KB Output is correct
10 Correct 456 ms 158412 KB Output is correct
11 Correct 845 ms 159800 KB Output is correct
12 Correct 1426 ms 161440 KB Output is correct
13 Correct 749 ms 289008 KB Output is correct
14 Correct 910 ms 289324 KB Output is correct
15 Correct 1418 ms 290432 KB Output is correct
16 Correct 2077 ms 291432 KB Output is correct
17 Correct 3694 ms 292432 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3286 ms 252100 KB Output is correct
2 Correct 3430 ms 258748 KB Output is correct
3 Correct 3440 ms 256472 KB Output is correct
4 Correct 3464 ms 258816 KB Output is correct
5 Correct 3277 ms 244804 KB Output is correct
6 Correct 2711 ms 170840 KB Output is correct
7 Correct 4487 ms 317844 KB Output is correct
8 Correct 4629 ms 317840 KB Output is correct
9 Correct 4591 ms 317876 KB Output is correct
10 Correct 4501 ms 316384 KB Output is correct
11 Correct 4240 ms 298644 KB Output is correct
12 Correct 3564 ms 205512 KB Output is correct
13 Correct 4878 ms 363748 KB Output is correct
14 Correct 4703 ms 363820 KB Output is correct
15 Correct 4660 ms 363688 KB Output is correct
16 Correct 4641 ms 361828 KB Output is correct
17 Correct 4290 ms 339792 KB Output is correct
18 Correct 3391 ms 223836 KB Output is correct
19 Correct 4572 ms 363796 KB Output is correct
20 Correct 4533 ms 363748 KB Output is correct
21 Correct 4596 ms 363816 KB Output is correct
22 Correct 4634 ms 365984 KB Output is correct
23 Correct 4346 ms 343820 KB Output is correct
24 Correct 3445 ms 227984 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 40140 KB Output is correct
2 Correct 20 ms 40140 KB Output is correct
3 Correct 19 ms 40140 KB Output is correct
4 Correct 19 ms 40140 KB Output is correct
5 Correct 18 ms 40188 KB Output is correct
6 Correct 19 ms 40144 KB Output is correct
7 Correct 19 ms 40244 KB Output is correct
8 Correct 18 ms 40268 KB Output is correct
9 Correct 20 ms 40252 KB Output is correct
10 Correct 19 ms 40272 KB Output is correct
11 Correct 18 ms 40236 KB Output is correct
12 Correct 22 ms 40308 KB Output is correct
13 Correct 20 ms 40220 KB Output is correct
14 Correct 25 ms 40260 KB Output is correct
15 Correct 20 ms 40244 KB Output is correct
16 Correct 20 ms 40240 KB Output is correct
17 Correct 21 ms 40316 KB Output is correct
18 Correct 20 ms 40356 KB Output is correct
19 Correct 40 ms 41540 KB Output is correct
20 Correct 41 ms 41660 KB Output is correct
21 Correct 46 ms 41932 KB Output is correct
22 Correct 49 ms 42140 KB Output is correct
23 Correct 93 ms 47300 KB Output is correct
24 Correct 93 ms 49472 KB Output is correct
25 Correct 93 ms 50592 KB Output is correct
26 Correct 99 ms 53120 KB Output is correct
27 Correct 19 ms 40220 KB Output is correct
28 Correct 22 ms 40180 KB Output is correct
29 Correct 20 ms 40260 KB Output is correct
30 Correct 32 ms 40436 KB Output is correct
31 Correct 83 ms 41288 KB Output is correct
32 Correct 20 ms 40212 KB Output is correct
33 Correct 21 ms 40408 KB Output is correct
34 Correct 20 ms 40396 KB Output is correct
35 Correct 25 ms 40472 KB Output is correct
36 Correct 38 ms 40656 KB Output is correct
37 Correct 113 ms 41660 KB Output is correct
38 Correct 22 ms 42052 KB Output is correct
39 Correct 23 ms 42060 KB Output is correct
40 Correct 26 ms 42208 KB Output is correct
41 Correct 50 ms 42724 KB Output is correct
42 Correct 177 ms 43932 KB Output is correct
43 Correct 121 ms 76860 KB Output is correct
44 Correct 128 ms 76852 KB Output is correct
45 Correct 137 ms 76888 KB Output is correct
46 Correct 187 ms 77840 KB Output is correct
47 Correct 606 ms 83472 KB Output is correct
48 Correct 25 ms 41676 KB Output is correct
49 Correct 52 ms 41932 KB Output is correct
50 Correct 185 ms 42388 KB Output is correct
51 Correct 333 ms 43236 KB Output is correct
52 Correct 87 ms 60544 KB Output is correct
53 Correct 138 ms 60692 KB Output is correct
54 Correct 380 ms 61720 KB Output is correct
55 Correct 714 ms 62528 KB Output is correct
56 Correct 404 ms 157996 KB Output is correct
57 Correct 456 ms 158412 KB Output is correct
58 Correct 845 ms 159800 KB Output is correct
59 Correct 1426 ms 161440 KB Output is correct
60 Correct 749 ms 289008 KB Output is correct
61 Correct 910 ms 289324 KB Output is correct
62 Correct 1418 ms 290432 KB Output is correct
63 Correct 2077 ms 291432 KB Output is correct
64 Correct 3694 ms 292432 KB Output is correct
65 Correct 3286 ms 252100 KB Output is correct
66 Correct 3430 ms 258748 KB Output is correct
67 Correct 3440 ms 256472 KB Output is correct
68 Correct 3464 ms 258816 KB Output is correct
69 Correct 3277 ms 244804 KB Output is correct
70 Correct 2711 ms 170840 KB Output is correct
71 Correct 4487 ms 317844 KB Output is correct
72 Correct 4629 ms 317840 KB Output is correct
73 Correct 4591 ms 317876 KB Output is correct
74 Correct 4501 ms 316384 KB Output is correct
75 Correct 4240 ms 298644 KB Output is correct
76 Correct 3564 ms 205512 KB Output is correct
77 Correct 4878 ms 363748 KB Output is correct
78 Correct 4703 ms 363820 KB Output is correct
79 Correct 4660 ms 363688 KB Output is correct
80 Correct 4641 ms 361828 KB Output is correct
81 Correct 4290 ms 339792 KB Output is correct
82 Correct 3391 ms 223836 KB Output is correct
83 Correct 4572 ms 363796 KB Output is correct
84 Correct 4533 ms 363748 KB Output is correct
85 Correct 4596 ms 363816 KB Output is correct
86 Correct 4634 ms 365984 KB Output is correct
87 Correct 4346 ms 343820 KB Output is correct
88 Correct 3445 ms 227984 KB Output is correct
89 Correct 3198 ms 258344 KB Output is correct
90 Correct 3660 ms 280996 KB Output is correct
91 Correct 4197 ms 311392 KB Output is correct
92 Correct 4378 ms 321052 KB Output is correct
93 Correct 4444 ms 335280 KB Output is correct
94 Correct 4407 ms 347348 KB Output is correct
95 Correct 4563 ms 367096 KB Output is correct
96 Correct 4579 ms 367028 KB Output is correct
97 Correct 4546 ms 367072 KB Output is correct
98 Correct 4488 ms 367140 KB Output is correct
99 Correct 4557 ms 367204 KB Output is correct
100 Correct 4599 ms 367172 KB Output is correct