Submission #98717

#TimeUsernameProblemLanguageResultExecution timeMemory
98717youngyojunAlternating Current (BOI18_alternating)C++11
100 / 100
610 ms27224 KiB
#include <bits/stdc++.h> #define eb emplace_back #define sz(V) ((int)(V).size()) #define allv(V) ((V).begin()),((V).end()) using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; void fuk() { puts("impossible"); exit(0); } const int MAXN = 200055; const int MAXM = 200055; struct PFS { int d[MAXN*2], N; void init() { fill(d, d+MAXN*2, 0); } void add(int s, int e) { d[s]++; d[e+1]--; } bool cal() { for(int i = 1; i <= N*2; i++) d[i+1] += d[i]; for(int i = 1; i <= N; i++) if(!(d[i] + d[i+N])) return false; return true; } } preA, preB; vector<int> T[MAXN*2]; vector<int> G[MAXM], CH; bitset<MAXM> isChild; int prt[MAXM]; bitset<MAXM> CA, CB; int A[MAXM], B[MAXM]; int Ans[MAXM]; int N, M; bool isValid() { preA.init(); preB.init(); for(int i = 1; i <= M; i++) (Ans[i] ? preA : preB).add(A[i], B[i]); return preA.cal() && preB.cal(); } void dfs(int i, int c) { prt[i] = c; for(int v : G[i]) if(!prt[v]) dfs(v, c); } int main() { ios::sync_with_stdio(false); cin >> N >> M; preA.N = preB.N = N; for(int i = 1; i <= M; i++) { cin >> A[i] >> B[i]; if(A[i] > B[i]) B[i] += N; if(B[i]-A[i] == N-1) { A[i] = 1; B[i] = N; } T[A[i]].eb(i); T[A[i]+N].eb(i); } { int ci = -1; for(int i = 1; i <= M; i++) if(1 == A[i] && B[i] == N) ci = i; if(0 < ci) { for(int i = 1; i <= M; i++) if(i != ci) { isChild[i] = true; G[ci].eb(i); } } else { for(int i = 1; i <= N*2; i++) sort(allv(T[i]), [&](int a, int b) { if(B[a] != B[b]) return B[a] > B[b]; return a < b; }); for(int i = 1, et = 0, ei = -1; i <= N*2; i++) { for(int v : T[i]) { int e = i + (B[v]-A[v]); if(e <= et) { isChild[v] = true; G[ei].eb(v); } else { et = e; ei = v; } } } } } for(int i = 1; i <= M; i++) if(!isChild[i]) CH.eb(i); for(int i : CH) dfs(i, i); for(int i = 1; i <= M; i++) G[i].clear(); for(int i = 1; i <= M; i++) if(isChild[i]) G[prt[i]].eb(i); sort(allv(CH), [&](int a, int b) { return A[a] < A[b]; }); for(int v : CH) preA.add(A[v], B[v]); if(!preA.cal()) fuk(); preA.init(); if(sz(CH) & 1) { if(sz(CH) < 10) { for(int i = 0, n = sz(CH); i < n; i++) { for(int j = 0; j < i; j++) Ans[CH[j]] = (i-j-1) & 1; for(int j = i; j < n; j++) Ans[CH[j]] = (j-i) & 1; for(int j = 1; j <= M; j++) if(isChild[j]) Ans[j] = !Ans[prt[j]]; if(isValid()) break; } } else { int ret = 0; for(int i = 0; i < 10000; i++) for(int j = 0; j < 10000; j++) ret = (ret + i + j) % 998353288; if(!ret) puts("WTF"); int PS[MAXN*2] = {0, }; int n = sz(CH); for(int i = 0; i < n; i++) { int s = B[CH[(n+i-1)%n]] + 1; int e = A[CH[(i+1)%n]] - 1; if(!i) s -= N; if(s > e) { CB[i] = true; continue; } fill(PS+s, PS+e+1, 0); for(int v : G[CH[i]]) { int a = max(s, A[v]), b = min(e, B[v]); if(a <= b) { PS[a]++; PS[b+1]--; } a = max(s, A[v]-N); b = min(e, B[v]-N); if(a <= b) { PS[a]++; PS[b+1]--; } a = max(s, A[v]+N); b = min(e, B[v]+N); if(a <= b) { PS[a]++; PS[b+1]--; } } bool flag = false; for(int i = s; i <= e; i++) { PS[i+1] += PS[i]; if(!PS[i]) flag = true; } CB[i] = !flag; } for(int i = 0; i < n; i++) { int s = B[CH[(n+i-2)%n]] + 1; int e = A[CH[(i+1)%n]] - 1; if(i-2 < 0) s -= N; if(n <= i+1) e += N; if(s > e) { CA[i] = true; continue; } fill(PS+s, PS+e+1, 0); vector<int> V = G[CH[(n+i-1)%n]]; for(int v : G[CH[i]]) V.eb(v); for(int v : V) { int a = max(s, A[v]), b = min(e, B[v]); if(a <= b) { PS[a]++; PS[b+1]--; } a = max(s, A[v]-N); b = min(e, B[v]-N); if(a <= b) { PS[a]++; PS[b+1]--; } a = max(s, A[v]+N); b = min(e, B[v]+N); if(a <= b) { PS[a]++; PS[b+1]--; } } bool flag = false; for(int i = s; i <= e; i++) { PS[i+1] += PS[i]; if(!PS[i]) flag = true; } CA[i] = !flag; } int cnt = 0; for(int i = 0; i < n; i++) if(CB[i]) cnt++; for(int i = 0; i < n; i++) { if(!CA[i]) continue; int ncnt = cnt; if(CB[i]) ncnt--; if(CB[(n+i-1)%n]) ncnt--; if(ncnt < n-2) continue; for(int j = 0; j < i; j++) Ans[CH[j]] = (i-j-1) & 1; for(int j = i; j < n; j++) Ans[CH[j]] = (j-i) & 1; for(int j = 1; j <= M; j++) if(isChild[j]) Ans[j] = !Ans[prt[j]]; break; } } } else { for(int i = 0, n = sz(CH); i < n; i++) Ans[CH[i]] = i & 1; for(int i = 1; i <= M; i++) if(isChild[i]) Ans[i] = !Ans[prt[i]]; } if(!isValid()) fuk(); for(int i = 1; i <= M; i++) printf("%d", !!Ans[i]); puts(""); return 0; }

Compilation message (stderr)

alternating.cpp: In function 'int main()':
alternating.cpp:150:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
     if(i-2 < 0) s -= N; if(n <= i+1) e += N;
     ^~
alternating.cpp:150:25: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
     if(i-2 < 0) s -= N; if(n <= i+1) e += N;
                         ^~
#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...