Submission #130607

#TimeUsernameProblemLanguageResultExecution timeMemory
130607dooweyPort Facility (JOI17_port_facility)C++14
100 / 100
3986 ms230264 KiB
#pragma GCC optimize("Ofast") #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ld, ld> pdd; #define fi first #define se second #define mp make_pair #define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N = (int)1e6 + 2; const int inf = (int)1e8; const int MOD = (int)1e9 + 7; pii tr[2][N * 4 + 51]; int k; void update(int tv, int ps, pii nw){ ps += k; tr[tv][ps] = nw; ps /= 2; while(ps > 0){ if(tv == 0) tr[tv][ps] = min(tr[tv][ps * 2], tr[tv][ps * 2 + 1]); if(tv == 1) tr[tv][ps] = max(tr[tv][ps * 2], tr[tv][ps * 2 + 1]); ps /= 2; } } pii query(int tv, int cl, int cr){ cl += k; cr += k; pii cur = mp(-inf, -1); if(tv == 0) cur.fi = inf; while(cl <= cr){ if(cl % 2 == 1){ if(tv==0) cur = min(cur, tr[tv][cl]); else cur = max(cur, tr[tv][cl]); cl ++ ; } if(cr % 2 == 0){ if(tv==0) cur = min(cur, tr[tv][cr]); else cur = max(cur, tr[tv][cr]); cr -- ; } cl /= 2; cr /= 2; } return cur; } pii cl[N * 2]; pii cr[N * 2]; pii q[N]; int bit[N]; void dfs(int u, int b){ bit[u] = b; update(0, q[u].se, mp(inf, -1)); update(1, q[u].fi, mp(-inf, -1)); int l = q[u].fi, r = q[u].se; pii cur; while(1){ cur = query(0, l, r); if(cur.se == -1 || cur.fi >= l) break; dfs(cur.se, !b); } while(1){ cur = query(1, l, r); if(cur.se == -1 || cur.fi <= r){ break; } dfs(cur.se, !b); } } int sum[2][N * 4]; void upd(int bt, int id, int x){ id += k; while(id > 0){ sum[bt][id] += x; id /= 2; } } int qry(int bt, int l, int r){ l += k; r += k; int res = 0; while(l <= r){ if(l % 2 == 1) res += sum[bt][l ++ ]; if(r % 2 == 0) res += sum[bt][r -- ]; l /= 2; r /= 2; } return res; } int main(){ fastIO; for(int i = 0 ; i < N * 2; i ++ ) cl[i] = mp(inf, -1), cr[i] = mp(-inf, -1); int n; cin >> n; k = n * 2; for(int i = 0 ; i < k ; i ++ ){ update(0, i, mp(+inf, -1)); update(1, i, mp(-inf, -1)); } for(int i = 0 ; i < n; i ++ ){ cin >> q[i].fi >> q[i].se; q[i].fi -- ; q[i].se -- ; cl[q[i].se] = mp(q[i].fi, i); cr[q[i].fi] = mp(q[i].se, i); bit[i] = -1; update(0, q[i].se, cl[q[i].se]); update(1, q[i].fi, cr[q[i].fi]); } int ans = 1; for(int i = 0 ; i < k ; i ++ ){ if(bit[i] == -1){ dfs(i, 0); ans = (ans * 2ll) % MOD; } } for(int i = 0 ; i < n; i ++ ){ upd(bit[i], q[i].se, +1); } for(int i = k - 1; i >= 0 ; i -- ){ if(cr[i].se != -1){ upd(bit[cr[i].se], cr[i].fi, -1); if(qry(bit[cr[i].se], i, cr[i].fi) > 0){ ans = 0; } } } cout << ans << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...