Submission #337294

#TimeUsernameProblemLanguageResultExecution timeMemory
337294super_j6Port Facility (JOI17_port_facility)C++14
78 / 100
990 ms1048580 KiB
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <array>
#include <stack>
#include <deque>
using namespace std;
#define endl '\n'
#define ll long long
#define pi pair<int, int>
#define f first
#define s second
 
typedef pair<deque<int>, deque<int>> T;
 
const int mod = 1000000007;
const int mxn = 1000001;
int n;
pi a[mxn];
stack<T> stk;
 
int f(int x){
	if(!x) return stk.top().f.empty() ? 2 * n + 2 : stk.top().f.front();
	else return stk.top().s.empty() ? 2 * n + 2 : stk.top().s.front();
}
 
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n;
	
	for(int i = 0; i < n; i++) cin >> a[i].f >> a[i].s;
	a[n] = {2 * n + 1, 2 * n + 1};
	
	sort(a, a + n);
	
	int ret = 1;
	for(int i = 0; i <= n; i++){
		while(!stk.empty()){
			for(int j = 0; j < 2; j++){
				while(f(j) < a[i].f){
					if(!j) stk.top().f.pop_front();
					else stk.top().s.pop_front();
				} 
			}
			if(f(0) > f(1)) swap(stk.top().f, stk.top().s);
			if(!stk.top().f.empty()) break;
			stk.pop(), (ret *= 2) %= mod;
		}
		if(stk.empty() || a[i].s < f(0)){
			stk.push(T());
			stk.top().f.push_front(a[i].s);
		}else{
			while(stk.size() > 1 && stk.top().s.empty()){
				T x;
				swap(stk.top(), x);
				stk.pop();
				if(a[i].s < f(0)){
					stk.push(T());
					swap(stk.top(), x);
					break;
				}
				if(x.f.size() < stk.top().f.size()){
					while(!x.f.empty()){
						stk.top().f.push_front(x.f.back());
						x.f.pop_back();
					}
				}else{
					swap(x.f, stk.top().f);
					while(!x.f.empty()){
						stk.top().f.push_back(x.f.front());
						x.f.pop_front();
					}
				}
			}
			if(a[i].s > f(1)){
				ret = 0;
				break;
			}
			stk.top().s.push_front(a[i].s);
		}
	}
	
	cout << ret << endl;
 
	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...