제출 #1261376

#제출 시각아이디문제언어결과실행 시간메모리
1261376tvgkPort Facility (JOI17_port_facility)C++20
0 / 100
0 ms320 KiB
#include<bits/stdc++.h> using namespace std; #define task "a" #define se second #define fi first #define ll long long #define ii pair<ll, ll> const long mxN = 2e6 + 7, MOD = 1e9 + 7; ii lazy[mxN * 4], tree[mxN * 4], dsu[mxN], a[mxN]; int n; void Down(int j) { if (!lazy[j].fi) return; if (tree[j * 2].fi) { tree[j * 2] = lazy[j]; lazy[j * 2] = lazy[j]; } if (tree[j * 2 + 1].fi) { tree[j * 2 + 1] = lazy[j]; lazy[j * 2 + 1] = lazy[j]; } lazy[j] = {0, 0}; } void Up(int j) { if (!tree[j * 2].fi) tree[j] = tree[j * 2 + 1]; else if (!tree[j * 2 + 1].fi) tree[j] = tree[j * 2]; else if (tree[j * 2] != tree[j * 2 + 1]) tree[j].fi = -1; else tree[j] = tree[j * 2]; } ii Find(int j) { if (dsu[j].fi != j) { ii res = Find(dsu[j].fi); dsu[j].fi = res.fi; dsu[j].se ^= res.se; } return dsu[j]; } void Union(ii u, ii v) { bool tmp = u.se; u = Find(u.fi); if (u.fi == v.fi) { if ((u.se ^ tmp) == v.se) { cout << 0; exit(0); } return; } dsu[u.fi].fi = v.fi; dsu[u.fi].se ^= 1 ^ tmp; return; } void Get(int u, int v, int id, int j = 1, int l = 1, int r = n * 2) { if (u > r || l > v || !tree[j].fi) return; if (u <= l && r <= v && tree[j].fi != -1) { Union(tree[j], {id, 0}); tree[j] = lazy[j] = {id, 1}; return; } Down(j); int mid = (l + r) / 2; Get(u, v, id, j * 2, l, mid); Get(u, v, id, j * 2 + 1, mid + 1, r); Up(j); } void Upd(int vt, int id, int j = 1, int l = 1, int r = n * 2) { if (vt > r || l > vt) return; if (l == r) { tree[j] = {id, 0}; return; } Down(j); int mid = (l + r) / 2; Upd(vt, id, j * 2, l, mid); Upd(vt, id, j * 2 + 1, mid + 1, r); Up(j); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen(task".INP", "r", stdin); //freopen(task".OUT", "w", stdout); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i].fi >> a[i].se; dsu[i].fi = i; dsu[i].se = 0; } sort(a + 1, a + n + 1); for (int i = 1; i <= n; i++) { Get(a[i].fi, a[i].se, i); Upd(a[i].se, i); } ll ans = 1; for (int i = 1; i <= n; i++) { if (Find(i).fi == i) ans = ans * 2 % MOD; } 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...