Submission #27812

#TimeUsernameProblemLanguageResultExecution timeMemory
27812khsoo01Port Facility (JOI17_port_facility)C++11
100 / 100
2379 ms114752 KiB
#include<bits/stdc++.h>
#define X first
#define Y second
using namespace std;
typedef pair<int, int> pii;
const int N = 1000005, mod = 1e9+7;
int n;
bool vis[N];

vector<int> st;
set<pii> s;

struct gugan {
	int s, e;
	bool operator < (const gugan &T) const {
		return e > T.e;
	}
} g[N];
vector<gugan> res[2];

int mgi (int A, int B) {
	if(A == -1) return B;
	if(B == -1) return A;
	return g[A].s < g[B].s ? A : B;
}

struct disj {
	int fr[N], op[N];
	void init () {
		for(int i=1;i<=n;i++) {
			fr[i] = i; op[i] = -1;
		}
	}
	int ff (int P) {
		if(fr[P] == P) return P;
		return fr[P] = ff(fr[P]);
	}
	int fo (int P) {
		if(op[P] == -1) return -1;
		return op[P] = ff(op[P]);
	}
	void Union (int A, int B) {
		A = ff(A); B = ff(B);
		if(op[A] == -1) op[A] = B;
		if(op[B] == -1) op[B] = A;
		op[A] = fo(A); op[B] = fo(B);
		int P = mgi(A, op[B]), Q = mgi(B, op[A]);
		fr[A] = P; fr[op[B]] = P;
		fr[B] = Q; fr[op[A]] = Q;
		op[P] = Q; op[Q] = P;
	}
} uf;

vector<pii> ev;

bool can (vector<gugan> &V) {
	ev.clear(); st.clear();
	for(int i=0;i<V.size();i++) {
		ev.push_back(pii(V[i].s, i+1));
		ev.push_back(pii(V[i].e, -i-1));
	}
	sort(ev.begin(), ev.end());
	for(int i=0;i<ev.size();i++) {
		int T = ev[i].Y;
		if(T < 0) {
			if(st.back() != -T) return false;
			st.pop_back();
		}
		else st.push_back(T);
	}
	return true;
}

int main()
{
	scanf("%d",&n); uf.init();
	for(int i=1;i<=n;i++) {
		scanf("%d%d",&g[i].s,&g[i].e);
	}
	sort(g+1, g+1+n);
	for(int i=1;i<=n;i++) {
		while(!st.empty() && g[i].e < g[st.back()].s) {
			st.pop_back();
		}
		auto it = s.lower_bound(pii(g[i].s, 0));
		if(it != s.end() && (it->X) <= g[i].e) {
			int V = uf.ff(it->Y);
			while(!st.empty()) {
				int T = st.back(); st.pop_back();
				if(uf.ff(T) == V || uf.fo(T) == V) break;
				uf.Union(T, i);
			}
			uf.Union(V, i);
		}
		int A = uf.ff(i), B = uf.fo(i);
		st.push_back(mgi(A, B));
		s.insert(pii(g[i].s, i));
	}
	int ans = 1;
	for(int i=1;i<=n;i++) {
		if(uf.ff(i) == i && !vis[i]) {
			ans = (ans * 2) % mod;
			if(~uf.op[i]) vis[uf.fo(i)] = true;
		}
	}
	for(int i=1;i<=n;i++) {
		res[vis[uf.ff(i)]].push_back(g[i]);
	}
	if(!can(res[0]) || !can(res[1])) puts("0");
	else printf("%d\n",ans);
}

Compilation message (stderr)

port_facility.cpp: In function 'bool can(std::vector<gugan>&)':
port_facility.cpp:58:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<V.size();i++) {
               ^
port_facility.cpp:63:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<ev.size();i++) {
               ^
port_facility.cpp: In function 'int main()':
port_facility.cpp:76:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n); uf.init();
                ^
port_facility.cpp:78:32: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&g[i].s,&g[i].e);
                                ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...