Submission #1177183

#TimeUsernameProblemLanguageResultExecution timeMemory
1177183KluydQJoker (BOI20_joker)C++20
100 / 100
693 ms46372 KiB
#include <bits/stdc++.h> #define respagold ios_base::sync_with_stdio(0), cin.tie(0); //#define int long long #define ll long long #define int2 __int128_t #define FOR( i, x, n, d ) for( int i = x; i <= n; i += d ) #define FORR( i, x, n, d ) for( int i = x; i >= n; i -= d ) #define F first #define S second #define all(x) x.begin(), x.end() #define sz(x) (int)(x.size()) #define pb push_back #define ins insert #define lb lower_bound #define ub upper_bound #define pii pair <int, int> #define mkp make_pair using namespace std; const int N = 4e5 + 123; const int inf = 1e9; const int mod = 1e9 + 7; const double eps = 1e-13; int a[N], b[N], c[N], l[N], r[N], n, m, q, k, z, x, y, w, d[N], p[N], ans[N], opt[N], ok; vector <pii> g[N], ord[N]; mt19937 rng( chrono::steady_clock::now().time_since_epoch().count()); int rand( int l, int r ) { uniform_int_distribution <int> uid( l, r ); return uid( rng ); } vector <pair <int, pii>> otk; int pa( int v ) { if( v == p[v] ) return v; return pa( p[v] ); } bool unite( int v, int u ) { v = pa(v), u = pa(u); if( v == u ) { otk.pb({ -1, { -1, -1 }}); otk.pb({ -1, { -1, -1 }}); return 0; } if( d[v] < d[u] ) swap( v, u ); otk.pb({ v, { d[v], p[v] }}); otk.pb({ u, { d[u], p[u] }}); d[v] += (d[v] == d[u]), p[u] = v; return 1; } void merge( int uka ) { unite( a[uka] + n, b[uka] ); unite( a[uka], b[uka] + n ); otk.pb({ 0, { ok, ok } }); if( pa(a[uka]) == pa(b[uka]) || pa(a[uka] + n) == pa(b[uka] + n) ) ok = 1; } void clean( int i ) { FOR( ngrjbi, 1, 5, 1 ) { int fi = otk.back().F; if( fi != -1 ) { if( fi == 0 ) ok = otk.back().S.S; else tie(d[fi], p[fi]) = otk.back().S; } otk.pop_back(); } } void dc( int l, int r, int tl, int tr ) { if( l > r ) return; int md = l + r >> 1; FOR( i, l, md - 1, 1 ) merge(i); FORR( i, tr, max(md, tl), 1 ) { if( !ok ) opt[md] = i; merge(i); } FOR( i, max(md, tl), tr, 1 ) clean(i); merge(md); if( opt[md] != m + 1 ) dc( md + 1, r, opt[md], tr ); clean(md); FOR( i, l, md - 1, 1 ) clean(i); FOR( i, opt[md] + 1, tr, 1 ) merge(i); dc( l, md - 1, tl, min( tr, opt[md] ) ); FOR( i, opt[md] + 1, tr, 1 ) clean(i); } void solve() { cin >> n >> m >> q; FOR( i, 1, 2 * n, 1 ) p[i] = i, d[i] = ok = 0; FOR( i, 1, m, 1 ) { cin >> a[i] >> b[i]; opt[i] = m + 1; g[a[i]].pb({ b[i], i }), g[b[i]].pb({ a[i], i }); } // tipa 2-sat // x -> 0, x + n -> 1 dc( 1, m, 1, m ); FOR( i, 1, q, 1 ) { cin >> x >> y; cout << ( opt[x] <= y ? "NO\n" : "YES\n" ); } // FOR( i, 1, m, 1 ) cout << opt[i] << ' '; } signed main() { // freopen("connect.in", "r", stdin); // freopen("connect.out", "w", stdout); respagold int test = 1; if( !test ) cin >> test; while( test -- ) { solve(); } } // solved by KluydQ
#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...