제출 #1033978

#제출 시각아이디문제언어결과실행 시간메모리
1033978goodspeed0208Joker (BOI20_joker)C++14
25 / 100
161 ms12848 KiB
#include<bits/stdc++.h> #define pii pair<int, int> using namespace std; int n, m, q; vector<int>f, sz, same, dif; void init() { for (int i = 0 ; i < n ; i++) { f[i] = i; same[i] = i; dif[i] = -1; sz[i] = 1; } } int find(int x) { //if (f[x][j] == -1) return -1; if (x == f[x]) return x; else return f[x] = find(f[x]); } int finds(int x) { if (x == -1) return -1; if (x == same[x]) return x; else return same[x] = finds(same[x]); } bool add(int a, int b) { int fa = find(a), fb = find(b); int sa = finds(a), sb = finds(b); //cout << fa << " " << sa << " " << fb << " " << sb << "\n"; if (fa == fb) { if (sa == sb) return true; else return false; } /*if (sz[fa] > sz[fb]) { swap(fa, fb); swap(sa, sb); }*/ f[fa] = fb; sz[fb] += sz[fa]; //cout << fa << " " << dif[fa] << " " << finds(dif[fa]) << "\n"; assert(dif[fa] == finds(dif[fa])); assert(dif[fb] == finds(dif[fb])); dif[fa] = finds(dif[fa]); dif[fb] = finds(dif[fb]); if ((fa == sa && fb == sb) || (fa != sa && fb != sb)) { if (dif[fa] != -1) same[dif[fa]] = fb; if (dif[fb] != -1) same[fa] = dif[fb]; else dif[fb] = fa; } else { same[fa] = fb; if (dif[fa] != -1 && dif[fb] != -1) same[dif[fa]] = dif[fb]; else if (dif[fa] != -1) dif[fb] = dif[fa]; } //for (int i = 0 ; i < n ; i++) cout << find(i) << " "; cout << "\n"; //for (int i = 0 ; i < n ; i++) cout << finds(i) << " "; cout <<"\n"; //cout << "\n"; return false; } signed main() { //ios::sync_with_stdio(false); //cin.tie(0); cin >> n >> m >> q; f.resize(n); sz.resize(n); same.resize(n); dif.resize(n); vector<pii>e; int a, b; for (int i = 0 ; i < m ; i++) { cin >> a >> b; a--, b--; e.push_back({a, b}); } int l, r; vector<pair<pii, int> >rg(q); for (int i = 0 ; i < q ; i++) { cin >> rg[i].first.first >> rg[i].first.second; rg[i].first.first--; rg[i].first.second--; rg[i].second = i; } sort(rg.begin(), rg.end(), [&](pair<pii, int> x, pair<pii, int> y) {return x.first.second < y.first.second;}); vector<int>ans(q, 0); r = m-1; bool can = 0; init(); for (int i = q-1 ; i >= 0 ; i--) { //cout <<can << " " << rg[i].first.second << "\n"; if (can) { ans[rg[i].second] = 1; continue; } while (!can && r > rg[i].first.second) { //cout << r <<" " <<e[r].first <<" "<< e[r].second << "\n"; can = add(e[r].first, e[r].second); r--; } if(can) ans[rg[i].second] = 1; } for (auto i: ans) cout << (i ? "YES" : "NO") << "\n"; } /* 6 8 5 1 3 1 5 1 6 2 5 2 6 3 4 3 5 5 6 1 8 1 3 1 6 1 2 1 4 */

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

Joker.cpp: In function 'int main()':
Joker.cpp:75:6: warning: unused variable 'l' [-Wunused-variable]
   75 |  int l, r;
      |      ^
#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...