제출 #1202893

#제출 시각아이디문제언어결과실행 시간메모리
1202893JooDdaePort Facility (JOI17_port_facility)C++20
100 / 100
980 ms156732 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; int n, a[1001001], b[1001001], p[1001001], c[2002002], d[1001001]; priority_queue<array<int, 2>, vector<array<int, 2>>, greater<>> pq, s[1001001][2]; int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); } int merge(int x, int y) { int k = d[x] == d[y]; if((x = find(x)) == (y = find(y))) return 0; if(s[x][0].size()+s[x][1].size() > s[y][0].size()+s[y][1].size()) swap(x, y); for(int i=0;i<2;i++) { while(!s[x][i].empty()) { auto [c, u] = s[x][i].top(); s[x][i].pop(); s[y][i^k].push({c, u}), d[u] = i^k; } } p[x] = y; return 1; } void add(int u, int i) { for(int j=0;j<2;j++) { while(!s[u][j].empty() && s[u][j].top()[0] <= i) s[u][j].pop(); if(!s[u][j].empty()) pq.push(s[u][j].top()); } } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n; for(int i=1;i<=n;i++) cin >> a[i] >> b[i]; for(int i=1;i<=n;i++) c[a[i]] = c[b[i]] = p[i] = i, s[i][0].push({b[i], i}); for(int i=1;i<=n+n;i++) { int u = c[i]; if(i == b[u]) { add(find(u), i); continue; } int P = i; while(!pq.empty() && pq.top()[0] < b[u]) { auto [c, x] = pq.top(); pq.pop(); if(c <= P) continue; P = c; if(!merge(x, u) && d[x] == d[u]) return cout << 0, 0; } add(find(u), i); } int ans = 1; for(int i=1;i<=n;i++) if(i == find(i)) ans = ans * 2 % 1000000007; cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...