Submission #338879

#TimeUsernameProblemLanguageResultExecution timeMemory
338879wwddPort Facility (JOI17_port_facility)C++14
100 / 100
1606 ms226244 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> ii;
const ll M = 1e9+7;
class U {
	private:
		vector<set<int>> cont[2];
		vi p,sz;
		int n,nc;
	public:
		U(vector<ii> w) {
			n = w.size();
			cont[0].assign(n,set<int>());
			cont[1].assign(n,set<int>());
			nc = n;
			sz.assign(n,1);
			for(int i=0;i<n;i++) {
				p.push_back(i);
				cont[0][i].insert(w[i].second);
			}
		}
		int find(int a) {
			if(a == p[a]) {return a;}
			return p[a] = find(p[a]);
		}
		bool same(int a, int b) {return find(a) == find(b);}
		bool un(int a, int b, int u, int v) {
			if(same(a,b)) {return false;}
			int x = find(a),y = find(b);
			int par = (cont[0][x].count(u))^(cont[1][y].count(v));
			if(sz[x] < sz[y]) {swap(x,y);}
			for(int i=0;i<2;i++) {
				cont[i][x].insert(cont[i^par][y].begin(),cont[i^par][y].end());
				cont[i^par][y].clear();
			}
			p[y] = x;
			sz[x] += sz[y];
			nc--;
			return true;
		}
		int num() {
			return nc;
		}
		ii pop(int u) {
			u = find(u);
			int res[2] = {1<<29,1<<29};
			for(int i=0;i<2;i++) {
				if(cont[i][u].size() > 0) {
					res[i] = *cont[i][u].begin();
				}
			}
			int idx = res[0] > res[1];
			if(cont[idx][u].size() > 0) {
				cont[idx][u].erase(cont[idx][u].begin());
				res[idx] = (cont[idx][u].size() > 0?*cont[idx][u].begin():1<<29);
			}
			return {res[0],res[1]};
		}
		ll dup(int u) {
			u = find(u);
			int res = -1e9;
			for(int i=0;i<2;i++) {
				if(cont[i][u].empty()) {
					return 1e9;
				}
				res = max(res,*cont[i][u].begin());
			}
			return res;
		}
};
int main() {
	ios::sync_with_stdio(0);cin.tie(0);
	int n;
	cin >> n;
	vector<ii> w;
	vi rm(2*n,-1);
	for(int i=0;i<n;i++) {
		int a,b;
		cin >> a >> b;
		a--;b--;
		w.emplace_back(a,b);
	}
	sort(w.begin(),w.end());
	for(int i=0;i<n;i++) {
		rm[w[i].first] = rm[w[i].second] = i;
	}
	U bs(w);
	map<int,int> lu;
	int rop = 0;
	ll res = 1;
	for(int i=0;i<w.size();i++) {
		ii va = w[i];
		while(!lu.empty() && lu.begin()->first < va.first) {
			int id = bs.find(lu.begin()->second);
			lu.erase(lu.begin());
			ii nx = {-1,-1};
			while(min(nx.first,nx.second) < va.first) {
				nx = bs.pop(id);
			}
			int bu[2] = {nx.first,nx.second};
			lu[min(nx.first,nx.second)] = id;
		}
		if(!lu.empty() && lu.begin()->first < va.second) {
			ll mv = lu.begin()->first;
			while(!lu.empty() && lu.begin()->first < va.second) {
				ll ko = lu.begin()->second;
				ll kv = lu.begin()->first;
				if(bs.dup(ko) < va.second) {
					res = 0;
				}
				bs.un(ko,i,kv,va.second);
				lu.erase(lu.begin());
			}
			lu[mv] = i;
		} else {
			lu[va.second] = i;
		}
	}
	ll lol = bs.num();
	for(int i=0;i<lol;i++) {
		res *= 2;
		if(res >= M) {res -= M;}
	}
	cout << res << '\n';
}

Compilation message (stderr)

port_facility.cpp: In function 'int main()':
port_facility.cpp:93:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |  for(int i=0;i<w.size();i++) {
      |              ~^~~~~~~~~
port_facility.cpp:102:8: warning: unused variable 'bu' [-Wunused-variable]
  102 |    int bu[2] = {nx.first,nx.second};
      |        ^~
port_facility.cpp:91:6: warning: unused variable 'rop' [-Wunused-variable]
   91 |  int rop = 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...