제출 #556931

#제출 시각아이디문제언어결과실행 시간메모리
556931Jomnoi다리 (APIO19_bridges)C++17
100 / 100
2108 ms12372 KiB
#include <bits/stdc++.h> #define DEBUG false using namespace std; const int MAX_N = 5e4 + 10; const int MAX_M = 1e5 + 10; const int MAX_Q = 1e5 + 10; const int BLK = 1000; int parent[MAX_N], sz[MAX_N]; int U[MAX_M], V[MAX_M], D[MAX_M], changed[MAX_M]; int T[MAX_Q], X[MAX_Q], Y[MAX_Q], ans[MAX_Q]; vector <int> unchanged, update, query, tojoin[BLK]; stack <int> stk; int root(int u) { if(u == parent[u]) { return u; } return root(parent[u]); } void merge(int u, int v) { u = root(u), v = root(v); if(u == v) { return; } if(sz[u] < sz[v]) { swap(u, v); } sz[u] += sz[v]; parent[v] = u; stk.push(v); } void rollback(int timer) { while(stk.size() > timer) { int v = stk.top(); stk.pop(); sz[root(v)] -= sz[v]; parent[v] = v; } } int main() { cin.tie(nullptr)->sync_with_stdio(false); int N, M; cin >> N >> M; for(int i = 1; i <= M; i++) { cin >> U[i] >> V[i] >> D[i]; } int Q; cin >> Q; for(int i = 1; i <= Q; i++) { cin >> T[i] >> X[i] >> Y[i]; if(T[i] == 1) { changed[X[i]] = true; update.push_back(i); } else { query.push_back(i); } } for(int l = 1; l <= Q; l += BLK) { int r = min(Q, l + BLK - 1); iota(parent + 1, parent + N + 1, 1); fill(sz + 1, sz + N + 1, 1); unchanged.clear(), update.clear(), query.clear(); fill(changed + 1, changed + M + 1, false); while(!stk.empty()) { stk.pop(); } for(int i = l; i <= r; i++) { if(T[i] == 1) { changed[X[i]] = true; update.push_back(i); } else { query.push_back(i); } } for(int i = 1; i <= M; i++) { if(changed[i] == false) { unchanged.push_back(i); } } for(int i = l; i <= r; i++) { if(T[i] == 1) { D[X[i]] = Y[i]; } else { tojoin[i - l].clear(); for(auto u : update) { if(D[X[u]] >= Y[i]) { tojoin[i - l].push_back(X[u]); } } } } sort(query.begin(), query.end(), [&](const int &a, const int &b) { return Y[a] > Y[b]; }); sort(unchanged.begin(), unchanged.end(), [&](const int &a, const int &b) { return D[a] > D[b]; }); int j = 0; for(auto i : query) { while(j < unchanged.size() and D[unchanged[j]] >= Y[i]) { merge(U[unchanged[j]], V[unchanged[j]]); j++; } int timer = stk.size(); for(auto e : tojoin[i - l]) { merge(U[e], V[e]); } ans[i] = sz[root(X[i])]; rollback(timer); } } for(int i = 1; i <= Q; i++) { if(T[i] == 2) { cout << ans[i] << '\n'; } } return 0; }

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

bridges.cpp: In function 'void rollback(int)':
bridges.cpp:38:22: warning: comparison of integer expressions of different signedness: 'std::stack<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   38 |     while(stk.size() > timer) {
      |           ~~~~~~~~~~~^~~~~~~
bridges.cpp: In function 'int main()':
bridges.cpp:119:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  119 |             while(j < unchanged.size() and D[unchanged[j]] >= Y[i]) {
      |                   ~~^~~~~~~~~~~~~~~~~~
#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...