제출 #95293

#제출 시각아이디문제언어결과실행 시간메모리
95293dalgerokPort Facility (JOI17_port_facility)C++14
100 / 100
2912 ms131204 KiB
#include<bits/stdc++.h> using namespace std; const int N = 2e6 + 5, MOD = 1e9 + 7, INF = 1e9; int n, cl[N], b[N], pos[N], t1[4 * N], t2[4 * N]; pair < int, int > a[N]; void build(int v, int l, int r){ if(l == r){ t1[v] = t2[v] = b[l]; return; } int mid = (r + l) >> 1; build(v + v, l, mid); build(v + v + 1, mid + 1, r); t1[v] = max(t1[v + v], t1[v + v + 1]); t2[v] = min(t2[v + v], t2[v + v + 1]); } void del(int v, int l, int r, int pos){ if(l == r){ t1[v] = -INF; t2[v] = +INF; return; } int mid = (r + l) >> 1; if(pos <= mid){ del(v + v, l, mid, pos); } else{ del(v + v + 1, mid + 1, r, pos); } t1[v] = max(t1[v + v], t1[v + v + 1]); t2[v] = min(t2[v + v], t2[v + v + 1]); } int get_min(int v, int l, int r, int tl, int tr){ if(l > r || l > tr || tl > r){ return +INF; } if(tl <= l && r <= tr){ return t2[v]; } int mid = (r + l) >> 1; return min(get_min(v + v, l, mid, tl, tr), get_min(v + v + 1, mid + 1, r, tl, tr)); } int get_max(int v, int l, int r, int tl, int tr){ if(l > r || l > tr || tl > r){ return -INF; } if(tl <= l && r <= tr){ return t1[v]; } int mid = (r + l) >> 1; return max(get_max(v + v, l, mid, tl, tr), get_max(v + v + 1, mid + 1, r, tl, tr)); } void dfs(int v, int color = 0){ cl[v] = color; del(1, 1, 2 * n, a[v].first); del(1, 1, 2 * n, a[v].second); while(true){ int l = get_min(1, 1, 2 * n, a[v].first, a[v].second); if(l >= a[v].first){ break; } int to = pos[l]; if(cl[to] != -1){ if(cl[to] != cl[v]){ cout << 0; exit(0); } } dfs(to, (color ^ 1)); } while(true){ int r = get_max(1, 1, 2 * n, a[v].first, a[v].second); if(r <= a[v].second){ break; } int to = pos[r]; if(cl[to] != -1){ if(cl[to] != cl[v]){ cout << 0; exit(0); } } dfs(to, (color ^ 1)); } } void check(){ vector < int > q[2]; for(int i = 1; i <= 2 * n; i++){ int x = pos[i]; if(i == a[x].first){ q[cl[x]].push_back(x); } else{ if(q[cl[x]].back() != x){ cout << 0; exit(0); } q[cl[x]].pop_back(); } } } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n; for(int i = 1; i <= n; i++){ cin >> a[i].first >> a[i].second; } sort(a + 1, a + n + 1); for(int i = 1; i <= n; i++){ int x = a[i].first, y = a[i].second; b[x] = y; b[y] = x; pos[x] = pos[y] = i; } build(1, 1, 2 * n); memset(cl, -1, sizeof(cl)); int ans = 1; for(int i = 1; i <= n; i++){ if(cl[i] == -1){ dfs(i); ans += ans; if(ans >= MOD){ ans -= MOD; } } } check(); 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...