Submission #531154

# Submission time Handle Problem Language Result Execution time Memory
531154 2022-02-27T21:29:38 Z Alex_tz307 Dynamic Diameter (CEOI19_diameter) C++17
49 / 100
5000 ms 367760 KB
#include <bits/stdc++.h>

using namespace std;

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

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;
    }
    edges.clear();
    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]);
    }
    dp.clear();
    dpLin.clear();
    maxDist.clear();
    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 22 ms 40148 KB Output is correct
2 Correct 19 ms 40140 KB Output is correct
3 Correct 21 ms 40196 KB Output is correct
4 Correct 20 ms 40200 KB Output is correct
5 Correct 20 ms 40140 KB Output is correct
6 Correct 19 ms 40140 KB Output is correct
7 Correct 20 ms 40268 KB Output is correct
8 Correct 20 ms 40260 KB Output is correct
9 Correct 21 ms 40288 KB Output is correct
10 Correct 20 ms 40240 KB Output is correct
11 Correct 20 ms 40268 KB Output is correct
12 Correct 19 ms 40196 KB Output is correct
13 Correct 20 ms 40340 KB Output is correct
14 Correct 25 ms 40388 KB Output is correct
15 Correct 20 ms 40244 KB Output is correct
16 Correct 19 ms 40268 KB Output is correct
17 Correct 24 ms 40288 KB Output is correct
18 Correct 20 ms 40268 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 40148 KB Output is correct
2 Correct 19 ms 40140 KB Output is correct
3 Correct 21 ms 40196 KB Output is correct
4 Correct 20 ms 40200 KB Output is correct
5 Correct 20 ms 40140 KB Output is correct
6 Correct 19 ms 40140 KB Output is correct
7 Correct 20 ms 40268 KB Output is correct
8 Correct 20 ms 40260 KB Output is correct
9 Correct 21 ms 40288 KB Output is correct
10 Correct 20 ms 40240 KB Output is correct
11 Correct 20 ms 40268 KB Output is correct
12 Correct 19 ms 40196 KB Output is correct
13 Correct 20 ms 40340 KB Output is correct
14 Correct 25 ms 40388 KB Output is correct
15 Correct 20 ms 40244 KB Output is correct
16 Correct 19 ms 40268 KB Output is correct
17 Correct 24 ms 40288 KB Output is correct
18 Correct 20 ms 40268 KB Output is correct
19 Correct 42 ms 41560 KB Output is correct
20 Correct 46 ms 41676 KB Output is correct
21 Correct 48 ms 41868 KB Output is correct
22 Correct 58 ms 42336 KB Output is correct
23 Correct 74 ms 47368 KB Output is correct
24 Correct 83 ms 49344 KB Output is correct
25 Correct 97 ms 50548 KB Output is correct
26 Correct 122 ms 53096 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 40140 KB Output is correct
2 Correct 24 ms 40132 KB Output is correct
3 Correct 21 ms 40272 KB Output is correct
4 Correct 30 ms 40404 KB Output is correct
5 Correct 76 ms 41268 KB Output is correct
6 Correct 21 ms 40224 KB Output is correct
7 Correct 21 ms 40436 KB Output is correct
8 Correct 22 ms 40428 KB Output is correct
9 Correct 23 ms 40384 KB Output is correct
10 Correct 42 ms 40668 KB Output is correct
11 Correct 107 ms 41668 KB Output is correct
12 Correct 24 ms 42068 KB Output is correct
13 Correct 25 ms 42144 KB Output is correct
14 Correct 37 ms 42184 KB Output is correct
15 Correct 55 ms 42700 KB Output is correct
16 Correct 157 ms 43868 KB Output is correct
17 Correct 131 ms 76764 KB Output is correct
18 Correct 130 ms 76852 KB Output is correct
19 Correct 135 ms 76984 KB Output is correct
20 Correct 175 ms 77908 KB Output is correct
21 Correct 564 ms 83332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 41676 KB Output is correct
2 Correct 53 ms 41940 KB Output is correct
3 Correct 167 ms 42452 KB Output is correct
4 Correct 336 ms 43076 KB Output is correct
5 Correct 76 ms 60380 KB Output is correct
6 Correct 145 ms 60788 KB Output is correct
7 Correct 395 ms 61832 KB Output is correct
8 Correct 683 ms 62856 KB Output is correct
9 Correct 367 ms 157988 KB Output is correct
10 Correct 454 ms 158520 KB Output is correct
11 Correct 915 ms 159828 KB Output is correct
12 Correct 1458 ms 161204 KB Output is correct
13 Correct 766 ms 289864 KB Output is correct
14 Correct 907 ms 290456 KB Output is correct
15 Correct 1384 ms 292040 KB Output is correct
16 Correct 2146 ms 293460 KB Output is correct
17 Correct 3698 ms 294788 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3382 ms 255880 KB Output is correct
2 Correct 3481 ms 262592 KB Output is correct
3 Correct 3664 ms 260356 KB Output is correct
4 Correct 4081 ms 262664 KB Output is correct
5 Correct 3646 ms 248724 KB Output is correct
6 Correct 3084 ms 175112 KB Output is correct
7 Correct 4999 ms 321860 KB Output is correct
8 Correct 4601 ms 321820 KB Output is correct
9 Correct 4676 ms 321900 KB Output is correct
10 Correct 4750 ms 320456 KB Output is correct
11 Correct 4612 ms 302600 KB Output is correct
12 Correct 3891 ms 209624 KB Output is correct
13 Execution timed out 5011 ms 367760 KB Time limit exceeded
14 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 22 ms 40148 KB Output is correct
2 Correct 19 ms 40140 KB Output is correct
3 Correct 21 ms 40196 KB Output is correct
4 Correct 20 ms 40200 KB Output is correct
5 Correct 20 ms 40140 KB Output is correct
6 Correct 19 ms 40140 KB Output is correct
7 Correct 20 ms 40268 KB Output is correct
8 Correct 20 ms 40260 KB Output is correct
9 Correct 21 ms 40288 KB Output is correct
10 Correct 20 ms 40240 KB Output is correct
11 Correct 20 ms 40268 KB Output is correct
12 Correct 19 ms 40196 KB Output is correct
13 Correct 20 ms 40340 KB Output is correct
14 Correct 25 ms 40388 KB Output is correct
15 Correct 20 ms 40244 KB Output is correct
16 Correct 19 ms 40268 KB Output is correct
17 Correct 24 ms 40288 KB Output is correct
18 Correct 20 ms 40268 KB Output is correct
19 Correct 42 ms 41560 KB Output is correct
20 Correct 46 ms 41676 KB Output is correct
21 Correct 48 ms 41868 KB Output is correct
22 Correct 58 ms 42336 KB Output is correct
23 Correct 74 ms 47368 KB Output is correct
24 Correct 83 ms 49344 KB Output is correct
25 Correct 97 ms 50548 KB Output is correct
26 Correct 122 ms 53096 KB Output is correct
27 Correct 20 ms 40140 KB Output is correct
28 Correct 24 ms 40132 KB Output is correct
29 Correct 21 ms 40272 KB Output is correct
30 Correct 30 ms 40404 KB Output is correct
31 Correct 76 ms 41268 KB Output is correct
32 Correct 21 ms 40224 KB Output is correct
33 Correct 21 ms 40436 KB Output is correct
34 Correct 22 ms 40428 KB Output is correct
35 Correct 23 ms 40384 KB Output is correct
36 Correct 42 ms 40668 KB Output is correct
37 Correct 107 ms 41668 KB Output is correct
38 Correct 24 ms 42068 KB Output is correct
39 Correct 25 ms 42144 KB Output is correct
40 Correct 37 ms 42184 KB Output is correct
41 Correct 55 ms 42700 KB Output is correct
42 Correct 157 ms 43868 KB Output is correct
43 Correct 131 ms 76764 KB Output is correct
44 Correct 130 ms 76852 KB Output is correct
45 Correct 135 ms 76984 KB Output is correct
46 Correct 175 ms 77908 KB Output is correct
47 Correct 564 ms 83332 KB Output is correct
48 Correct 26 ms 41676 KB Output is correct
49 Correct 53 ms 41940 KB Output is correct
50 Correct 167 ms 42452 KB Output is correct
51 Correct 336 ms 43076 KB Output is correct
52 Correct 76 ms 60380 KB Output is correct
53 Correct 145 ms 60788 KB Output is correct
54 Correct 395 ms 61832 KB Output is correct
55 Correct 683 ms 62856 KB Output is correct
56 Correct 367 ms 157988 KB Output is correct
57 Correct 454 ms 158520 KB Output is correct
58 Correct 915 ms 159828 KB Output is correct
59 Correct 1458 ms 161204 KB Output is correct
60 Correct 766 ms 289864 KB Output is correct
61 Correct 907 ms 290456 KB Output is correct
62 Correct 1384 ms 292040 KB Output is correct
63 Correct 2146 ms 293460 KB Output is correct
64 Correct 3698 ms 294788 KB Output is correct
65 Correct 3382 ms 255880 KB Output is correct
66 Correct 3481 ms 262592 KB Output is correct
67 Correct 3664 ms 260356 KB Output is correct
68 Correct 4081 ms 262664 KB Output is correct
69 Correct 3646 ms 248724 KB Output is correct
70 Correct 3084 ms 175112 KB Output is correct
71 Correct 4999 ms 321860 KB Output is correct
72 Correct 4601 ms 321820 KB Output is correct
73 Correct 4676 ms 321900 KB Output is correct
74 Correct 4750 ms 320456 KB Output is correct
75 Correct 4612 ms 302600 KB Output is correct
76 Correct 3891 ms 209624 KB Output is correct
77 Execution timed out 5011 ms 367760 KB Time limit exceeded
78 Halted 0 ms 0 KB -