Submission #1225465

#TimeUsernameProblemLanguageResultExecution timeMemory
1225465siewjhPort Facility (JOI17_port_facility)C++20
100 / 100
418 ms137432 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 1000005; const int MAXN2 = 2000005; const ll mod = 1e9 + 7; vector<pair<int, int>> adj[MAXN]; int fw[MAXN2], p[MAXN], rnk[MAXN], clr[MAXN]; int N, N2; void update(int x, int v){ for (; x <= N2; x += (x & -x)) fw[x] += v; } int query(int x){ int res = 0; for (; x; x -= (x & -x)) res += fw[x]; return res; } int rquery(int l, int r){ return query(r) - query(l - 1); } void dfs(int x, int c){ clr[x] = c; for (auto [nn, nc] : adj[x]){ if (clr[nn] == -1) dfs(nn, c != nc); else if (clr[nn] != (c != nc)){ cout << 0; exit(0); } } } ll pwr(ll a, ll b){ ll res = 1; for (; b; b >>= 1){ if (b & 1) res = res * a % mod; a = a * a % mod; } return res; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; N2 = N << 1; vector<pair<int, int>> vec(N); for (int i = 0; i < N; i++){ int l, r; cin >> l >> r; vec[i] = {r, l}; } for (int i = 1; i <= N2; i++) update(i, 1); sort(vec.begin(), vec.end()); vector<tuple<int, int, int>> st; memset(p, -1, sizeof(p)); memset(clr, -1, sizeof(clr)); for (int i = 0; i < N; i++){ int l, r; tie(r, l) = vec[i]; update(l, -1); update(r, -1); while (!st.empty()){ int pl, pr, pid; tie(pl, pr, pid) = st.back(); if (l < pl){ st.pop_back(); if (rquery(pl, pr) != 0){ adj[i].push_back({pid, 0}); adj[pid].push_back({i, 0}); } } else if (l < pr){ if (rquery(l, pr) != 0){ cout << 0; return 0; } adj[i].push_back({pid, 1}); adj[pid].push_back({i, 1}); break; } else break; } st.push_back({l, r, i}); } int cc = 0; for (int i = 0; i < N; i++) if (clr[i] == -1){ dfs(i, 0); cc++; } cout << pwr(2, cc); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...