Submission #1150463

#TimeUsernameProblemLanguageResultExecution timeMemory
1150463fryingducPort Facility (JOI17_port_facility)C++20
100 / 100
2025 ms217864 KiB
#include "bits/stdc++.h" using namespace std; #ifdef duc_debug #include "bits/debug.h" #else #define debug(...) #endif const int maxn = 2e6 + 6; const int mod = 1e9 + 7; int n, l[maxn], r[maxn]; int id[maxn], c[maxn]; struct segment_tree { int tree[maxn << 2]; segment_tree() { memset(tree, -0x3f, sizeof(tree)); } void update(int pos, int val, int ind, int l, int r) { if (l == r) { tree[ind] = val; return; } int mid = (l + r) >> 1; if (pos <= mid) { update(pos, val, ind << 1, l, mid); } else { update(pos, val, ind << 1 | 1, mid + 1, r); } tree[ind] = max(tree[ind << 1], tree[ind << 1 | 1]); } int get(int x, int y, int ind, int l, int r) { if (x > y || l > y || r < x) return -1e9; if (x <= l and r <= y) { return tree[ind]; } int mid = (l + r) >> 1; return max(get(x, y, ind << 1, l, mid), get(x, y, ind << 1 | 1, mid + 1, r)); } } sf, sb; void dfs(int u, int col) { c[u] = col + 1; while (true) { int x = sf.get(l[u] + 1, r[u] - 1, 1, 1, n * 2); if (x <= r[u]) break; x = id[x]; sf.update(l[x], -1e9, 1, 1, n * 2); sb.update(r[x], -1e9, 1, 1, n * 2); dfs(x, col ^ 1); } while (true) { int x = sb.get(l[u] + 1, r[u] - 1, 1, 1, n * 2); if (-x >= l[u]) break; x = id[-x]; sf.update(l[x], -1e9, 1, 1, n * 2); sb.update(r[x], -1e9, 1, 1, n * 2); dfs(x, col ^ 1); } } void solve() { cin >> n; for (int i = 1; i <= n; ++i) { cin >> l[i] >> r[i]; id[l[i]] = id[r[i]] = i; sf.update(l[i], r[i], 1, 1, n * 2); sb.update(r[i], -l[i], 1, 1, n * 2); } int ans = 1; for (int i = 1; i <= n; ++i) { if (c[i]) continue; ans = ans + ans; if (ans >= mod) ans -= mod; dfs(i, 0); } vector<pair<int, int>> interval; for (int ite = 1; ite <= 2; ++ite) { interval.clear(); for (int i = 1; i <= n; ++i) { if (c[i] == ite) { interval.emplace_back(l[i], i); interval.emplace_back(r[i], -i); } } sort(interval.begin(), interval.end()); stack<int> st; for (auto i:interval) { if (i.second > 0) { st.push(i.second); } else { if (st.empty() || st.top() != -i.second) { cout << 0; return; } st.pop(); } } } cout << ans; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); solve(); 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...