제출 #1147076

#제출 시각아이디문제언어결과실행 시간메모리
1147076woohyun_jngPort Facility (JOI17_port_facility)C++20
78 / 100
3117 ms1114112 KiB
#include <bits/stdc++.h> #define int long long #define MAX 3000000 #define MOD 1000000007 using namespace std; typedef array<int, 2> pr; int val[MAX], num[MAX], C[MAX]; vector<int> tree[MAX * 4], adj[MAX]; void query(int n, int s, int e, int l, int r, int v) { if (r < s || e < l) return; else if (l <= s && e <= r) { for (int i : tree[n]) adj[i].push_back(v), adj[v].push_back(i); while (tree[n].size() > 1) tree[n].pop_back(); } else { int m = s + e >> 1; query(n << 1, s, m, l, r, v), query(n << 1 | 1, m + 1, e, l, r, v); } } void update(int n, int s, int e, int x, int v) { if (x < s || e < x) return; tree[n].push_back(v); if (s == e) return; int m = s + e >> 1; update(n << 1, s, m, x, v), update(n << 1 | 1, m + 1, e, x, v); } bool dfs(int node, int par) { for (int i : adj[node]) { if (i == par) continue; if (C[i] != 0 && C[i] == C[node]) return false; else if (C[i] != 0) continue; C[i] = 3 - C[node]; if (!dfs(i, node)) return false; } return true; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0); int N, X, Y, ans = 1; cin >> N; for (int i = 1; i <= N; i++) cin >> X >> Y, val[X] = Y, num[X] = i; for (int i = 1; i <= (N << 1); i++) { if (!val[i]) continue; query(1, 1, N << 1, i, val[i], num[i]); update(1, 1, N << 1, val[i], num[i]); } for (int i = 1; i <= N; i++) { if (C[i]) continue; C[i] = 1; ans = ((dfs(i, 0) ? ans : 0) << 1) % MOD; } cout << ans << '\n'; 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...