Submission #257263

#TimeUsernameProblemLanguageResultExecution timeMemory
257263maximath_1Joker (BOI20_joker)C++11
100 / 100
268 ms14312 KiB
#include <stdio.h> #include <assert.h> #include <math.h> #include <limits.h> #include <time.h> #include <algorithm> #include <vector> #include <random> #include <iostream> #include <iomanip> #include <unordered_map> using namespace std; int n, m, q, lst[200005], par[200005], off[200005]; void init(){ for(int i = 1; i <= n; i ++){ par[i] = -1; off[i] = 0; } } pair<int, int> gt(int x){ int of = 0; while(par[x] >= 0){ of ^= off[x]; x = par[x]; } return {x, of}; } vector<array<int, 4> >md; int uni(int _x, int _y){ pair<int, int> x = gt(_x), y = gt(_y); if(x.first == y.first){ if(x.second == y.second) return 0; md.push_back({-1, -1, -1, -1}); return 1; } if(par[x.first] > par[y.first]) swap(x.first, y.first); md.push_back({x.first, y.first, par[x.first], par[y.first]}); par[x.first] += par[y.first]; par[y.first] = x.first; off[y.first] = x.second ^ y.second ^ 1; return 1; } void rollback(){ auto a = md.back(); md.pop_back(); if(a[0] != -1){ par[a[0]] = a[2]; par[a[1]] = a[3]; } } int u[200005], v[200005]; bool upd(int idx){ if(idx == m + 1) return 1; return uni(u[idx], v[idx]); } void restore(int _sz){ while(md.size() > _sz) rollback(); } void dnc(int xl, int xr, int yl, int yr){ // cout << xl << " " << xr << " " << yl << " " << yr << endl; if(xl > xr) return; int xm = (xl + xr) / 2, rs = -1, sz = md.size(); for(int i = xl; i < xm; i ++) if(!upd(i)){ rs = yr; assert(rs == m + 1); break; } int sz2 = md.size(); if(rs == -1){ int i = yr; while(i > yl && upd(i)) i --; rs = i; } lst[xm] = rs; if(lst[xm] == m + 1){ for(int i = xm + 1; i <= xr; i ++) lst[i] = rs; }else{ restore(sz2); if(!upd(xm)){ for(int i = xm + 1; i <= xr; i ++) lst[i] = m + 1; }else dnc(xm + 1, xr, lst[xm], yr); } restore(sz); for(int i = lst[xm] + 1; i <= yr; i ++) assert(upd(i)); dnc(xl, xm - 1, yl, lst[xm]); restore(sz); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> q; for(int i = 1; i <= m; i ++) cin >> u[i] >> v[i]; init(); dnc(1, m, 1, m + 1); for(int l, r;q--;){ cin >> l >> r; if(lst[l] <= r) cout << "NO\n"; else cout << "YES\n"; } return 0; }

Compilation message (stderr)

Joker.cpp: In function 'void restore(int)':
Joker.cpp:63:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(md.size() > _sz) rollback();
        ~~~~~~~~~~^~~~~
#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...