제출 #683632

#제출 시각아이디문제언어결과실행 시간메모리
683632NK_Port Facility (JOI17_port_facility)C++17
0 / 100
1 ms320 KiB
// 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...