Submission #373435

#TimeUsernameProblemLanguageResultExecution timeMemory
3734358e7Port Facility (JOI17_port_facility)C++14
0 / 100
13 ms19948 KiB
//Challenge: Accepted #include <iostream> #include <algorithm> #include <utility> #include <vector> #include <map> #include <set> #include <stack> #define ll long long #define maxn 1000005 #define mod 1000000007 #define pii pair<int, int> #define ff first #define ss second using namespace std; struct obj{ int l, r, id; obj() { l = 0, r = 0, id = 0; } obj(int a, int b, int c) { l = a, r = b, id = c; } }; obj a[maxn]; int ma[maxn]; inline bool cmp1(obj x, obj y) { return x.l < y.l; } inline bool cmp2(obj x, obj y) { return x.r > y.r; } int bit[2 * maxn]; void modify(int ind, int val) { for (;ind < 2 * maxn;ind += ind & (-ind)) bit[ind] = max(bit[ind], val); } int query(int ind) { int ret = 0; for (;ind > 0;ind -= ind & (-ind)) ret = max(ret, bit[ind]); return ret; } stack<obj> stk; int par[maxn]; int find(int x) { return x == par[x] ? x : par[x] = find(par[x]); } int main() { ios_base::sync_with_stdio(0);cin.tie(0); int n; cin >> n; for (int i = 0;i < n;i++) cin >> a[i].l >> a[i].r, a[i].id = i, par[i] = i; sort(a, a + n, cmp1); int poss = 1; for (int i = 0;i < n;i++) { ma[a[i].id] = query(a[i].r); //cout << a[i].l << " " << a[i].r << " " << ma[a[i].id] << endl; modify(a[i].r, a[i].r); } for (int i = 0;i < 2 * maxn;i++) bit[i] = 2 * maxn - 2 * n - 1; sort(a, a + n, cmp2); for (int i = 0;i < n;i++) { //cout << a[i].l << " " << a[i].r << endl; int val = query(2 * maxn - a[i].l); if (2 * maxn - val < ma[a[i].id]) { poss = 0; break; } modify(2 * maxn - a[i].l, 2 * maxn - a[i].l); } if (poss) { reverse(a, a + n); int ans = n; for (int ti = 0;ti < 2;ti++) { for (int i = 0;i < n;i++) { while (stk.size() && a[i].l < stk.top().l) stk.pop(); if (stk.size() && stk.top().r > a[i].l) { if (find(a[i].id) != find(stk.top().id)) { //cout << a[i].id << " " << stk.top().id << endl; par[find(a[i].id)] = find(stk.top().id); ans--; } } stk.push(a[i]); } for (int i = 0;i < n;i++) { a[i].l = 2 * maxn - a[i].l, a[i].r = 2 * maxn - a[i].r, swap(a[i].l, a[i].r); } reverse(a, a + n); } ll out = 1; for (int i = 0;i < ans;i++) out = out * 2 % mod; cout << out << "\n"; } else { cout << 0 << "\n"; } } /* 4 1 3 2 5 4 8 6 7 3 1 4 2 5 3 6 5 1 4 2 10 6 9 7 8 3 5 8 1 15 2 5 3 8 4 6 14 16 7 9 10 13 11 12 5 2 5 4 7 6 8 1 9 3 10 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...