Submission #412316

#TimeUsernameProblemLanguageResultExecution timeMemory
412316ngpin04Port Facility (JOI17_port_facility)C++14
100 / 100
1281 ms144036 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int N = 1e6 + 5; 
const int mod = 1e9 + 7;

vector <pair <int, int>> s[3];
vector <int> adj[N];

pair <int, int> a[N];

int id[2 * N];
int c[N];
int nxt[N];
int par[N];
int n;

int getnxt(int u) {
	return (nxt[u] == u || nxt[u] == 0) ? u : (nxt[u] = getnxt(nxt[u]));
}

int getpar(int u) {
	return (par[u] < 0) ? u : (par[u] = getpar(par[u]));
}

bool join(int u, int v) {
	u = getpar(u);
	v = getpar(v);
	if (u == v)
		return false;
	if (par[u] > par[v])
		swap(u, v);
	par[u] += par[v];
	par[v] = u;
	return true;
}

void dfs(int u) {
	for (int v : adj[u]) {
		if (!c[v]) {
			c[v] = 3 - c[u];
			dfs(v);
		} else if (c[u] == c[v]) {
			cout << 0;
			exit(0);
		}
	}
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) 
		cin >> a[i].fi >> a[i].se;
	sort(a + 1, a + n + 1);
	for (int i = 1; i <= n; i++) {
		id[a[i].fi] = i;
		id[a[i].se] = -i;
	}

	for (int i = 1, cur = 0; i <= 2 * n; i++) {
		int u = abs(id[i]);
		if (id[i] > 0) {
			nxt[u] = u;
			par[u] = -1;
			cur = u;
		} else {
			int pos = u;
			while (pos <= cur) {
				int lo = pos;
				int hi = n + 1;
				while (hi - lo > 1) {
					int mid = (lo + hi) >> 1;
					int nxtmid = getnxt(mid);
					if (nxtmid <= cur && getpar(nxtmid) == getpar(u)) 
						lo = mid;
					else 
						hi = mid;
				}
				pos = getnxt(hi);
				if (pos <= cur) {
					adj[u].push_back(pos);
					adj[pos].push_back(u);
					assert(join(u, pos));
				}
			}
			nxt[u] = u + 1;
		}
	}

	for (int i = 1; i <= n; i++)
		if (!c[i]) 
			c[i] = 1, dfs(i);

	for (int i = 1; i <= 2; i++)
		s[i].push_back(mp(0, 2 * n + 1));

	for (int i = 1; i <= 2 * n; i++) {
		int u = abs(id[i]);
		if (id[i] < 0) 
			s[c[u]].pop_back();
		else {
			if (a[u].se > s[c[u]].back().se) 
				return cout << 0, 0;
			s[c[u]].push_back(a[u]);
		}
	}

	int ans = 1;

	for (int i = 1; i <= n; i++)
		if (par[i] < 0)
			ans = ans * 2 % mod;

	cout << ans;
	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...