제출 #960666

#제출 시각아이디문제언어결과실행 시간메모리
960666MisterReaper다리 (APIO19_bridges)C++17
100 / 100
1558 ms124812 KiB
#include <bits/stdc++.h> using i64 = long long; constexpr int maxN = 5E4 + 5; std::vector<std::pair<int, int>> operations; int par[maxN], sz[maxN]; void reset() { std::iota(par, par + maxN, 0); std::fill(sz, sz + maxN, 1); operations.clear(); } int get(int a) { if(par[a] == a) { return a; } return get(par[a]); } bool unite(int u, int v) { u = get(u), v = get(v); if(u == v) { return false; } if(sz[u] > sz[v]) { std::swap(u, v); } par[u] = v; sz[v] += sz[u]; operations.emplace_back(u, v); return true; } void rollback() { auto [u, v] = operations.back(); operations.pop_back(); par[u] = u; sz[v] -= sz[u]; } int size(int a) { return sz[get(a)]; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n, m; std::cin >> n >> m; std::vector<bool> changed; std::vector<int> u(m), v(m), w(m); for(int i = 0; i < m; i++) { std::cin >> u[i] >> v[i] >> w[i]; u[i]--, v[i]--; } int q; std::cin >> q; std::vector<int> t(q), x(q), y(q); for(int i = 0; i < q; i++) { std::cin >> t[i] >> x[i] >> y[i]; x[i]--; } constexpr int B = 1000; std::vector<std::vector<int>> deck(q); std::vector<int> ans(q); for(int l = 0; l < q; l += B) { int r = std::min(q, l + B); changed.assign(m, false); reset(); std::vector<int> ask; for(int i = l; i < r; i++) { if(t[i] == 1) { changed[x[i]] = true; } else { ask.emplace_back(i); } } std::vector<int> edges, able; for(int i = 0; i < m; i++) { if(!changed[i]) { edges.emplace_back(i); } else { able.emplace_back(i); } } for(int i = l; i < r; i++) { if(t[i] == 1) { w[x[i]] = y[i]; } else { for(int j : able) { if(y[i] <= w[j]) { deck[i].emplace_back(j); } } } } std::sort(edges.begin(), edges.end(), [&](int lhs, int rhs) -> bool { return w[lhs] > w[rhs]; }); std::sort(ask.begin(), ask.end(), [&](int lhs, int rhs) -> bool { return y[lhs] > y[rhs]; }); int p = 0; for(int i : ask) { while(p != edges.size() && w[edges[p]] >= y[i]) { unite(u[edges[p]], v[edges[p]]); p++; } int ps = operations.size(); for(int j : deck[i]) { unite(u[j], v[j]); } ans[i] = size(x[i]); while(operations.size() != ps) { rollback(); } deck[i].clear(); } } for(int i = 0; i < q; i++) { if(t[i] == 2) { std::cout << ans[i] << '\n'; } } return 0; }

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

bridges.cpp: In function 'int main()':
bridges.cpp:116:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |             while(p != edges.size() && w[edges[p]] >= y[i]) {
      |                   ~~^~~~~~~~~~~~~~~
bridges.cpp:125:37: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  125 |             while(operations.size() != ps) {
      |                   ~~~~~~~~~~~~~~~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...