Submission #1219025

#TimeUsernameProblemLanguageResultExecution timeMemory
1219025poatPort Facility (JOI17_port_facility)C++17
0 / 100
0 ms320 KiB
// #pragma GCC optimize("Ofast") // #pragma GCC target("popcnt") #include <bits/stdc++.h> using namespace std; #define int long long // #define double long double #define mkp make_pair #define txt freopen("shortcut.in", "r", stdin), freopen("shortcut.out", "w", stdout); const int N = 1e6 + 10, K = 29, inf = 1e16, mod = 1e9 + 7; const double eps = 1e-6; struct seg { vector<int> t; int n; bool fl = 0; // 1 = max, 0 = min seg(int n_, int f) { n = n_; fl = f; t.resize(n * 4, (fl ? 0 : 1e9)); } int comb(int x, int y) { return (fl ? max(x, y) : min(x, y)); } void upd(int x, int l, int r, int ind, int val) { if(l == r) { t[x] = val; return; } int m = (l + r) / 2; if(ind <= m) upd(x * 2, l, m, ind, val); else upd(x * 2 + 1, m + 1, r, ind, val); t[x] = comb(t[x * 2], t[x * 2 + 1]); } int get(int x, int l, int r, int tl, int tr) { if(tl > tr) return (fl ? 0 : 1e9); if(l == tl && r == tr) return t[x]; int m = (l + r) / 2; return comb(get(x * 2, l, m, tl, min(m, tr)), get(x * 2 + 1, m + 1, r, max(tl, m + 1), tr)); } }; void solve() { int n; cin >> n; int A[n + 5], B[n + 5]; for(int i = 1; i <= n; i++) cin >> A[i] >> B[i]; vector<vector<int>> ev; for(int i = 1; i <= n; i++) { ev.push_back({A[i], 1, i}); ev.push_back({B[i], 0, i}); } sort(ev.begin(), ev.end(), [](vector<int> a, vector<int> b){ return a[0] < b[0]; }); vector<int> t1, t2; for(auto i : ev) { if(i[1] == 1) { if(t1.empty() || B[i[2]] < B[t1.back()]) t1.push_back(i[2]); else if(t2.empty() || B[i[2]] < B[t2.back()]) t2.push_back(i[2]); else { cout << "0\n"; return; } } else { if(!t1.empty() && t1.back() == i[2]) t1.pop_back(); else if(!t2.empty() && t2.back() == i[2]) t2.pop_back(); else assert(0); } // cout << i[0] << ' ' << i[1] << ' ' << i[2] << '\n'; // for(auto j : t1) // cout << j << ' '; // cout << '\n'; // for(auto j : t2) // cout << j << ' '; // cout << "\n\n"; } seg mn(n * 2, 0), mx(n * 2, 1); set<pair<int, int>> siz; for(int i = 1; i <= n; i++) { siz.insert({B[i] - A[i], A[i]}); mn.upd(1, 1, n * 2, A[i], B[i]); mx.upd(1, 1, n * 2, B[i], A[i]); } int res = 0; while(!siz.empty()) { int l = siz.begin()->second, r = l + siz.begin()->first; siz.erase(siz.begin()); int x = mn.get(1, 1, n * 2, l + 1, r); if(x != 1e9) { int L = mx.get(1, 1, n * 2, x, x), R = x; siz.erase({R - L, L}); mn.upd(1, 1, n * 2, l, R); mn.upd(1, 1, n * 2, L, 1e9); mx.upd(1, 1, n * 2, r, 0); mx.upd(1, 1, n * 2, R, l); r = R; siz.insert({r - l, l}); } else { x = mx.get(1, 1, n * 2, l, r - 1); if(x != 0) { int L = x, R = mn.get(1, 1, n * 2, x, x); siz.erase({R - L, L}); mn.upd(1, 1, n * 2, L, r); mn.upd(1, 1, n * 2, l, 1e9); mx.upd(1, 1, n * 2, R, 0); mx.upd(1, 1, n * 2, r, L); l = L; siz.insert({r - l, l}); } else { res++; mn.upd(1, 1, n * 2, l, 1e9); mx.upd(1, 1, n * 2, r, 0); } } } int ans = 1; for(int it = res; it--;) ans = ans * 2 % mod; cout << ans << '\n'; } signed main() { // txt; ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T = 1; for(; T--; solve()); } /* */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...