제출 #43728

#제출 시각아이디문제언어결과실행 시간메모리
43728MatheusLealVPort Facility (JOI17_port_facility)C++14
22 / 100
136 ms33472 KiB
#include <bits/stdc++.h>
#define N 3001
#define mod (1000000000 + 7)
#define f first
#define s second
using namespace std;
typedef pair<int, int> pii;

int n, ans, block[N][N], cor[N], qtd, pot[N];

pii v[N];

bool nope = false;

vector<int> grafo[N];

bool intersect(int i, int j)
{
	if(v[j].f < v[i].f) swap(i, j);

	if(v[i].f <= v[j].f && v[j].s <= v[i].s) return false;

	if(v[i].f < v[j].f && v[j].f < v[i].s) return true;

	return false;
}

void dfs_color(int x)
{
	for(auto v: grafo[x])
	{
		if(cor[v] == cor[x])
		{
			nope = true;

			return;
		}

		if(cor[v] != -1) continue;

		cor[v] = (cor[x] + 1)%2;

		dfs_color(v);
	}
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(0);

	cin>>n;

	for(int i = 1; i <= n; i++) cin>>v[i].f>>v[i].s;

	pot[0] = 1;

	for(int i = 1; i <= n; i++) pot[i] = (2*pot[i - 1])%mod;

	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			if(intersect(i, j))
			{
				grafo[i].push_back(j);

				grafo[j].push_back(i);
			}
		}
	}

	memset(cor, -1, sizeof cor);
	
	for(int i = 1; i <= n; i++)
	{
		if(cor[i] == -1)
		{
			qtd ++;

			cor[i] = 0;

			dfs_color(i);
		}
	}

	cout<<(nope ? 0 : pot[qtd])<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...