이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
using namespace std;
#define nl '\n'
#define mp make_pair
using pi = pair<int, int>;
using E = array<int, 3>;
const int MOD = 1e9+7;
int main() {
cin.tie(0)->sync_with_stdio(0);
int N; cin >> N;
vector<int> EV(2*N);
vector<int> A(N), B(N);
for(int i = 0; i < N; i++) {
cin >> A[i] >> B[i]; --A[i], --B[i];
EV[A[i]] = i;
EV[B[i]] = -1;
}
vector<vector<pi>> adj(N);
set<E> S;
vector<vector<E>> R(2*N);
for(int t = 0; t < 2*N; t++) {
// cout << "SET: " << nl;
// for(auto x : S) {
// cout << x[0] << " " << x[1] << " " << x[2] << nl;
// }
// cout << nl;
int e = EV[t];
if (e == -1) for(const auto &x : R[t]) S.erase(x);
else {
int mx = -1, mn = 1e9;
vector<E> rem;
for(const auto &x : S) {
auto [ti, u, w] = x;
if (ti > B[e]) break;
if (w) {
rem.push_back(x);
mx = max(mx, ti);
mn = min(mx, ti);
}
// cout << "EDGE: " << u << " " << e << " " << w << nl;
adj[u].push_back(mp(e, w));
adj[e].push_back(mp(u, w));
}
if (mx != -1) {
S.insert({mn, e, 0});
R[mx].push_back({mn, e, 0});
}
S.insert({B[e], e, 1});
R[B[e]].push_back({B[e], e, 1});
for(const auto &x : rem) S.erase(x);
}
}
bool bi = 1;
vector<int> P(N, -1);
function<void(int)> dfs = [&](int u) {
for(auto e : adj[u]) {
int v, w; tie(v, w) = e;
if (P[v] != -1) bi &= P[v] == (P[u] ^ w);
else { P[v] = P[u] ^ w; dfs(v); }
}
};
int ans = 1;
for(int i = 0; i < N; i++) if (P[i] == -1) { P[i] = 0; dfs(i); ans = (2 * ans) % MOD; }
cout << (!bi ? 0 : ans) << nl;
return 0;
}
/*
8
1 15
2 5
3 8
4 6
14 16
7 9
10 13
11 12
5
1 4
2 10
6 9
7 8
3 5
3
1 4
2 5
3 6
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |