Submission #119657

#TimeUsernameProblemLanguageResultExecution timeMemory
119657MilkiAlternating Current (BOI18_alternating)C++14
19 / 100
134 ms8208 KiB
#include<bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i = a; i < b; ++i) #define REP(i, n) FOR(i, 0, n) #define _ << " " << #define sz(x) ((int) x.size()) #define pb(x) push_back(x) #define TRACE(x) cerr << #x << " = " << x << endl typedef long long ll; typedef pair<int, int> point; const int MAXN = 1e5 + 5, off = 1 << 17; struct event{ int x, y, id; event(){} event(int x, int y, int id) : x(x), y(y), id(id) {} friend bool operator < (const event &A, const event &B){ if(A.x != B.x) return A.x < B.x; return A.y > B.y; } }; int n, m, par[MAXN]; event rail[MAXN]; vector <event> v, ev; bool sol[MAXN]; struct Tournament{ int t[2 * off], p[2 * off]; Tournament(){} void reset(){ memset(t, 0, sizeof(t)); memset(p, 0, sizeof(p)); } void prop(int x){ if(!t[x]) t[x] = p[x]; if(x < off){ p[x * 2] = max(p[x], p[x * 2]); p[x * 2 + 1] = max(p[x], p[x * 2 + 1]); } p[x] = 0; } void update(int x, int lo, int hi, int a, int b){ prop(x); if(lo >= b || hi <= a) return; if(lo >= a && hi <= b) { p[x] = 1; prop(x); return; } int mid = (lo + hi) >> 1; update(x * 2, lo, mid, a, b); update(x * 2 + 1, mid, hi, a, b); } int get(int x, int lo, int hi, int a, int b){ prop(x); if(lo >= b || hi <= a) return 0; if(lo >= a && hi <= b) return t[x]; int mid = (lo + hi) >> 1; return get(x * 2, lo, mid, a, b) + get(x * 2 + 1, mid, hi, a, b); } } T; bool check(int x){ T.reset(); REP(i, m){ if(sol[i] == x){ if(rail[i].x > rail[i].y){ T.update(1, 0, off, rail[i].x, n + 1); T.update(1, 0, off, 1, rail[i].y + 1); } else{ T.update(1, 0, off, rail[i].x, rail[i].y + 1); } } } int sum = 0; REP(i, n) sum += T.get(1, 0, off, i + 1, i + 2); if(sum == n) return true; else return false; } int parent[MAXN]; int f(int x){ if(parent[x] == x) return x; return par[x] = f(par[x]); } void spoji(int x, int y){ x = f(x); y = f(y); if(x == y) return; parent[y] = x; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); memset(par, -1, sizeof(par)); cin >> n >> m; REP(i, m){ int a, b; cin >> a >> b; rail[i] = event(a, b, i); parent[i] = i; if(a <= b) v.pb(event(a, b, i)); if(a > b) v.pb(event(a, b + n, i)); else v.pb(event(a + n, b + n, i)); } sort(v.begin(), v.end()); event curr = v[0]; FOR(i, 1, sz(v)){ if(curr.x <= v[i].x && curr.y >= v[i].y){ par[ v[i].id ] = curr.id; spoji(curr.id, v[i].id); } if(curr.y < v[i].y) curr = v[i]; } REP(i, m) if(f(i) == i) ev.pb(rail[i]); sort(ev.begin(), ev.end()); for(int i = 0; i < sz(ev); i += 2) sol[ ev[i].id ] = true; REP(i, m){ if(f(i) != i) sol[i] = !sol[ f(i) ] ; } if(check(0) && check(1)) REP(i, m) cout << sol[i]; else cout << "impossible"; }
#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...