답안 #683880

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
683880 2023-01-19T14:22:57 Z evenvalue 다리 (APIO19_bridges) C++17
27 / 100
1685 ms 524288 KB
#include <bits/stdc++.h>
using namespace std;

#ifdef evenvalue
  #include "debug.h"
  #define debug(...) print(#__VA_ARGS__, __VA_ARGS__)
#else
  #define debug(...)
#endif

using int64 = long long;
using ld = long double;

template<typename T>
using min_heap = priority_queue<T, vector<T>, greater<T>>;
template<typename T>
using max_heap = priority_queue<T, vector<T>, less<T>>;

namespace read {
int Int() {
  int x;
  cin >> x;
  return x;
}
}//namespace read

constexpr int kInf = 1e9 + 10;
constexpr int64 kInf64 = 1e15 + 10;
constexpr int kMod = 1e9 + 7;
constexpr int kBlockSize = 500;

class dsu {
  int n;
  std::vector<int> e;
  vector<pair<int, int>> history;

  int pfind(const int x) {
    return (e[x] < 0 ? x : pfind(e[x]));
  }

public:
  dsu() : n(0), comp(0) {}
  explicit dsu(const int n) : n(n), comp(n), e(n, -1) {}

  int comp;

  int find(const int x) {
    assert(0 <= x and x < n);
    return pfind(x);
  }

  bool unite(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) return false;
    if (e[x] > e[y]) swap(x, y);
    history.emplace_back(y, e[y]);
    e[x] += e[y];
    e[y] = x;
    comp--;
    return true;
  }

  bool rollback() {
    if (history.empty()) return false;
    const int y = history.back().first;
    const int x = find(y);
    e[x] -= history.back().second;
    e[y] = history.back().second;
    history.pop_back();
    return true;
  }

  bool same(const int x, const int y) {
    return (find(x) == find(y));
  }

  int size(const int x) {
    return -e[find(x)];
  }

  std::vector<std::vector<int>> components() {
    std::vector<std::vector<int>> res(n);
    for (int x = 0; x < n; x++) {
      res[pfind(x)].push_back(x);
    }
    res.erase(
        std::remove_if(res.begin(), res.end(), [&](const std::vector<int> &v) { return v.empty(); }),
        res.end());
    return res;
  }
};

inline void solution() {
  struct update {
    int index;
    int bridge;
    int limit;
  };

  struct query {
    int index;
    int speed;
    int start;

    bool operator<(const query &other) const {
      return speed > other.speed;
    }
  };

  struct edge {
    int x = -1;
    int y = -1;
    int w = -1;
    bool change = false;

    bool operator<(const edge &other) const {
      return w > other.w;
    }
  };

  const int n = read::Int();
  const int m = read::Int();

  vector<edge> edges(m);
  for (int i = 0; i < m; i++) {
    edges[i].x = read::Int() - 1;
    edges[i].y = read::Int() - 1;
    edges[i].w = read::Int();
  }

  vector<vector<update>> blocks = {{}};
  vector<query> queries;

  const int qq = read::Int();
  for (int i = 0; i < qq; i++) {
    const int t = read::Int();
    if (t == 1) {
      update cur{};
      cur.index = i;
      cur.bridge = read::Int() - 1;
      cur.limit = read::Int();
      blocks.back().push_back(cur);
    } else {
      query cur{};
      cur.index = i;
      cur.start = read::Int() - 1;
      cur.speed = read::Int();
      queries.push_back(cur);
    }
    if (blocks.back().size() == kBlockSize) blocks.emplace_back();
  }

  blocks.back().push_back({qq, -1, kInf});

  vector<int> ans(qq);
  vector<vector<edge>> connect(qq);

  for (int i = 0, j = 0; i < blocks.size(); i++) {
    const vector<update> &block = blocks[i];
    vector<edge> bridges = edges;

    vector<query> q;
    for (; j < queries.size(); j++) {
      if (queries[j].index > block.back().index) break;
      q.push_back(queries[j]);

      const query qry = queries[j];
      for (const update &u : block) {
        if (u.index > qry.index) break;
        bridges[u.bridge].w = u.limit;
      }

      for (const update &u : block) {
        if (u.index == qq) continue;
        if (bridges[u.bridge].w < qry.speed) continue;
        connect[qry.index].push_back(bridges[u.bridge]);
      }
    }

    for (const update &u : block) {
      if (u.index == qq) continue;
      bridges[u.bridge].change = true;
    }

    vector<edge> unchanged;
    for (const edge &bridge : bridges) {
      if (bridge.change) continue;
      unchanged.push_back(bridge);
    }
    sort(unchanged.begin(), unchanged.end());
    sort(q.begin(), q.end());

    dsu d(n);

    int k = 0;
    for (const query qry : q) {
      while (k < unchanged.size() and unchanged[k].w >= qry.speed) {
        d.unite(unchanged[k].x, unchanged[k].y);
        k++;
      }

      int rollbacks = 0;
      for (const edge e : connect[qry.index]) {
        rollbacks += d.unite(e.x, e.y);
      }

      ans[qry.index] = d.size(qry.start);
      connect[qry.index].clear();

      while (rollbacks--) {
        d.rollback();
      }
    }

    for (const update &u : block) {
      if (u.index == qq) continue;
      edges[u.bridge].w = u.limit;
    }
  }

  for (const query q : queries) {
    cout << ans[q.index] << '\n';
  }
}

int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  cout << fixed << setprecision(10);

  int testcases = 1;
  //cin >> testcases;
  while (testcases--) {
    solution();
  }
}

Compilation message

bridges.cpp: In constructor 'dsu::dsu(int)':
bridges.cpp:45:7: warning: 'dsu::comp' will be initialized after [-Wreorder]
   45 |   int comp;
      |       ^~~~
bridges.cpp:34:20: warning:   'std::vector<int> dsu::e' [-Wreorder]
   34 |   std::vector<int> e;
      |                    ^
bridges.cpp:43:12: warning:   when initialized here [-Wreorder]
   43 |   explicit dsu(const int n) : n(n), comp(n), e(n, -1) {}
      |            ^~~
bridges.cpp: In function 'void solution()':
bridges.cpp:158:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<solution()::update> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  158 |   for (int i = 0, j = 0; i < blocks.size(); i++) {
      |                          ~~^~~~~~~~~~~~~~~
bridges.cpp:163:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<solution()::query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  163 |     for (; j < queries.size(); j++) {
      |            ~~^~~~~~~~~~~~~~~~
bridges.cpp:197:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<solution()::edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  197 |       while (k < unchanged.size() and unchanged[k].w >= qry.speed) {
      |              ~~^~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 49 ms 26636 KB Output is correct
4 Correct 4 ms 1108 KB Output is correct
5 Correct 52 ms 29912 KB Output is correct
6 Correct 41 ms 32440 KB Output is correct
7 Correct 47 ms 27416 KB Output is correct
8 Correct 47 ms 24808 KB Output is correct
9 Correct 53 ms 40480 KB Output is correct
10 Correct 49 ms 27756 KB Output is correct
11 Correct 49 ms 27340 KB Output is correct
12 Correct 59 ms 35884 KB Output is correct
13 Correct 56 ms 29528 KB Output is correct
14 Correct 52 ms 26588 KB Output is correct
15 Correct 58 ms 29996 KB Output is correct
16 Correct 50 ms 33988 KB Output is correct
17 Correct 51 ms 34892 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1203 ms 275008 KB Output is correct
2 Correct 1236 ms 277212 KB Output is correct
3 Correct 1241 ms 278956 KB Output is correct
4 Correct 1293 ms 277176 KB Output is correct
5 Correct 1240 ms 278740 KB Output is correct
6 Correct 1685 ms 410796 KB Output is correct
7 Correct 1679 ms 413088 KB Output is correct
8 Correct 1679 ms 412560 KB Output is correct
9 Correct 36 ms 7860 KB Output is correct
10 Correct 1057 ms 339740 KB Output is correct
11 Correct 984 ms 345016 KB Output is correct
12 Runtime error 1498 ms 524288 KB Execution killed with signal 9
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 963 ms 275184 KB Output is correct
2 Correct 786 ms 342404 KB Output is correct
3 Correct 1149 ms 345116 KB Output is correct
4 Correct 965 ms 275676 KB Output is correct
5 Correct 38 ms 7784 KB Output is correct
6 Correct 1121 ms 351196 KB Output is correct
7 Correct 949 ms 252112 KB Output is correct
8 Correct 777 ms 183580 KB Output is correct
9 Runtime error 1097 ms 524288 KB Execution killed with signal 9
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 79 ms 11608 KB Output is correct
2 Correct 36 ms 6476 KB Output is correct
3 Correct 36 ms 6112 KB Output is correct
4 Correct 33 ms 6092 KB Output is correct
5 Correct 63 ms 11720 KB Output is correct
6 Correct 79 ms 11608 KB Output is correct
7 Correct 56 ms 11592 KB Output is correct
8 Correct 58 ms 8748 KB Output is correct
9 Correct 57 ms 8800 KB Output is correct
10 Correct 59 ms 8880 KB Output is correct
11 Correct 69 ms 10812 KB Output is correct
12 Correct 83 ms 10812 KB Output is correct
13 Correct 69 ms 10800 KB Output is correct
14 Correct 57 ms 11532 KB Output is correct
15 Correct 68 ms 11608 KB Output is correct
16 Correct 78 ms 11480 KB Output is correct
17 Correct 79 ms 11588 KB Output is correct
18 Correct 80 ms 11588 KB Output is correct
19 Correct 77 ms 11560 KB Output is correct
20 Correct 72 ms 11068 KB Output is correct
21 Correct 91 ms 11068 KB Output is correct
22 Correct 76 ms 11424 KB Output is correct
23 Correct 55 ms 10972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1203 ms 275008 KB Output is correct
2 Correct 1236 ms 277212 KB Output is correct
3 Correct 1241 ms 278956 KB Output is correct
4 Correct 1293 ms 277176 KB Output is correct
5 Correct 1240 ms 278740 KB Output is correct
6 Correct 1685 ms 410796 KB Output is correct
7 Correct 1679 ms 413088 KB Output is correct
8 Correct 1679 ms 412560 KB Output is correct
9 Correct 36 ms 7860 KB Output is correct
10 Correct 1057 ms 339740 KB Output is correct
11 Correct 984 ms 345016 KB Output is correct
12 Runtime error 1498 ms 524288 KB Execution killed with signal 9
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 49 ms 26636 KB Output is correct
4 Correct 4 ms 1108 KB Output is correct
5 Correct 52 ms 29912 KB Output is correct
6 Correct 41 ms 32440 KB Output is correct
7 Correct 47 ms 27416 KB Output is correct
8 Correct 47 ms 24808 KB Output is correct
9 Correct 53 ms 40480 KB Output is correct
10 Correct 49 ms 27756 KB Output is correct
11 Correct 49 ms 27340 KB Output is correct
12 Correct 59 ms 35884 KB Output is correct
13 Correct 56 ms 29528 KB Output is correct
14 Correct 52 ms 26588 KB Output is correct
15 Correct 58 ms 29996 KB Output is correct
16 Correct 50 ms 33988 KB Output is correct
17 Correct 51 ms 34892 KB Output is correct
18 Correct 1203 ms 275008 KB Output is correct
19 Correct 1236 ms 277212 KB Output is correct
20 Correct 1241 ms 278956 KB Output is correct
21 Correct 1293 ms 277176 KB Output is correct
22 Correct 1240 ms 278740 KB Output is correct
23 Correct 1685 ms 410796 KB Output is correct
24 Correct 1679 ms 413088 KB Output is correct
25 Correct 1679 ms 412560 KB Output is correct
26 Correct 36 ms 7860 KB Output is correct
27 Correct 1057 ms 339740 KB Output is correct
28 Correct 984 ms 345016 KB Output is correct
29 Runtime error 1498 ms 524288 KB Execution killed with signal 9
30 Halted 0 ms 0 KB -