Submission #1151743

#TimeUsernameProblemLanguageResultExecution timeMemory
1151743Robert_juniorJoker (BOI20_joker)C++20
6 / 100
1113 ms18604 KiB
#include<bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define ins insert #define pb push_back #define F first #define S second const int N = 4e5+100, M = 5e5 + 7, k = 650; const int mod = 1e9 + 7; int pr[N], sz[N], f[N], l[N], r[N], ql[N], qr[N], ans; bool res[N]; stack<array<int, 7>>s; vector<array<int, 3>>query[N]; int get(int v){ if(pr[v] == v) return v; else return get(pr[v]); } int get1(int v){ if(pr[v] == v) return f[v]; else return (get1(pr[v]) ^ f[v]); } void unite(int u, int v, bool keep){ int a = get(u), b = get(v); int f1 = get1(u), f2 = (get1(v)); if(a == b){ if(keep) s.push({u, v, a, b, f1, f2, 0}); if(f1 == f2) ans++; } else{ if(sz[a] < sz[b]){ swap(a, b); } if(keep) s.push({u, v, a, b, f1, f2, sz[b]}); sz[a] += sz[b]; pr[b] = a; sz[b] = 0; if(f1 == f2) f[b] ^= 1; } } void solve(){ int n, m, q; cin>>n>>m>>q; for(int i = 1; i <= m; i++){ cin>>l[i]>>r[i]; } for(int i = 1; i <= m; i++){ l[i + m] = l[i]; r[i + m] = r[i]; } for(int j = 1; j <= n; j++){ sz[j] = 1; pr[j] = j; f[j] = 0; } for(int i = 1; i <= q; i++){ cin>>ql[i]>>qr[i]; if(m - (qr[i] - ql[i] + 1) <= k){ for(int j = 1; j < ql[i]; j++){ unite(l[j], r[j], 1); } for(int j = qr[i] + 1; j <= m; j++){ unite(l[j], r[j], 1); } if(ans) res[i] = 1; while(s.size()){ int u = s.top()[0]; int v = s.top()[1]; int a = s.top()[2]; int b = s.top()[3]; int f1 = s.top()[4]; int f2 = s.top()[5]; if(a == b){ if(f1 == f2) ans--; } else{ if(sz[a] < sz[b]){ swap(a, b); } pr[b] = b; sz[b] = s.top()[6]; sz[a] -= s.top()[6]; if(f1 == f2) f[b] ^= 1; } s.pop(); } } else{ qr[i]++; ql[i] += m - 1; query[qr[i] / k].pb({ql[i], qr[i], i}); } } for(int i = 0; i < k; i++){ if(!query[i].size()) continue; for(int j = 1; j <= n; j++){ pr[j] = j; sz[j] = 1; f[j] = 0; } while(s.size()) s.pop(); int ans = 0; sort(all(query[i])); int pos = (i + 1) * k; for(auto [rr, ll, idx] : query[i]){ while(pos <= rr){ unite(l[pos], r[pos], 0); pos++; } int cur = (i + 1) * k - 1; while(cur >= ll){ unite(l[cur], r[cur], 1); cur--; } if(ans > 0) res[idx] = 1; while(s.size()){ int u = s.top()[0]; int v = s.top()[1]; int a = s.top()[2]; int b = s.top()[3]; int f1 = s.top()[4]; int f2 = s.top()[5]; if(a == b){ if(f1 == f2) ans--; } else{ if(sz[a] < sz[b]){ swap(a, b); } pr[b] = b; sz[b] = s.top()[6]; sz[a] -= s.top()[6]; if(f1 == f2) f[b] ^= 1; } s.pop(); } } } for(int i = 1; i <= q; i++){ if(res[i]) cout<<"YES\n"; else cout<<"NO\n"; } } main(){ ios_base :: sync_with_stdio(false); cin.tie(nullptr); int t = 1; //cin>>t; for(int i = 1; i <= t; i++){ //cout<<"Case "<<i<<": "; solve(); } }

Compilation message (stderr)

Joker.cpp:143:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  143 | main(){
      | ^~~~
#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...