제출 #1225015

#제출 시각아이디문제언어결과실행 시간메모리
1225015emptypringlescanPort Facility (JOI17_port_facility)C++17
100 / 100
427 ms125628 KiB
#include <bits/stdc++.h>
using namespace std;
bool cmp(pair<int,int> a,pair<int,int> b){
	return a.second<b.second;
}
int fenw[2000005];
void update(int x, int v){
	for(;x<2000005; x+=x&-x) fenw[x]+=v;
}
int query(int x){
	int ret=0;
	for(;x;x-=x&-x) ret+=fenw[x];
	return ret;
}
vector<pair<int,int> > adj[1000005];
bool can=true;
int col[1000005];
void dfs(int x, int c){
	assert(col[x]==-1);
	col[x]=c;
	for(auto i:adj[x]){
		if(col[i.first]==-1) dfs(i.first,c^i.second);
		else{
			if(col[i.first]!=(c^i.second)) can=false;
		}
	}
}
int32_t main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;
	pair<int,int> arr[n];
	for(int i=0; i<n; i++) cin >> arr[i].first >> arr[i].second;
	sort(arr,arr+n,cmp);
	for(int i=1; i<=2*n; i++) update(i,1);
	vector<int> mono;
	for(int i=0; i<n; i++){
		update(arr[i].first,-1);
		update(arr[i].second,-1);
		while(!mono.empty()&&arr[mono.back()].first>arr[i].first){
			int x=mono.back();
			mono.pop_back();
			if(query(arr[x].second)-query(arr[x].first-1)){
				adj[x].push_back({i,0});
				adj[i].push_back({x,0});
			}
		}
		if(!mono.empty()&&arr[mono.back()].second>arr[i].first){
			int x=mono.back();
			if(query(arr[x].second)-query(arr[i].first-1)){
				cout << 0;
				return 0;
			}
			adj[x].push_back({i,1});
			adj[i].push_back({x,1});
		}
		mono.push_back(i);
	}
	memset(col,-1,sizeof(col));
	int con=0;
	for(int i=0; i<n; i++) if(col[i]==-1){
		dfs(i,0);
		con++;
	}
	if(!can){
		cout << 0;
		return 0;
	}
	long long ans=1;
	for(int i=0; i<con; i++){
		ans*=2ll;
		ans%=1000000007;
	}
	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...