Submission #1299197

#TimeUsernameProblemLanguageResultExecution timeMemory
1299197vako_pPort Facility (JOI17_port_facility)C++20
22 / 100
6094 ms32608 KiB
#include<bits/stdc++.h> using namespace std; #define ll int #define pb push_back #define ff first #define sd second #define debug(x) cerr << #x << " -----> " << x << endl; //#pragma GCC optimize("O3") //#pragma GCC optimize("Ofast") //#pragma GCC optimize("unroll-loops") const int mxN = 1e6 + 5; ll n,mod = 1e9 + 7,val[mxN]; pair<ll,ll> a[mxN]; struct ds{ vector<ll> par; vector<vector<ll>> v; ll sz; void init(){ sz = n; par.resize(n + 1); v.resize(n + 1); for(int i = 1; i <= n; i++){ par[i] = i; v[i].pb(i); } } ll find(ll at){ if(par[at] == at) return at; par[at] = find(par[at]); return par[at]; } void merge(ll a, ll b){ bool ok = (val[a] == val[b]); a = find(a); b = find(b); if(a == b){ if(ok){ cout << 0; exit(0); } return; } sz--; if(v[a].size() < v[b].size()) swap(a, b); par[b] = a; // if(v[a].size() > v[b].size()) swap(v[a], v[b]); for(auto it : v[b]){ if(ok) val[it] = 1 - val[it]; v[a].pb(it); } v[b].clear(); } }; struct segtree{ vector<vector<ll>> v; ll sz = 1; void init(){ while(sz < 2 * n + 5) sz *= 2; v.resize(2 * sz); } void set(ll l, ll r, ll val, ll x, ll lx, ll rx){ if(lx >= r or rx <= l) return; if(lx >= l and rx <= r){ v[x].pb(val); return; } ll mid = lx + (rx - lx) / 2; set(l, r, val, 2 * x + 1, lx, mid); set(l, r, val, 2 * x + 2, mid, rx); } void set(ll l, ll r, ll val){ set(l, r, val, 0, 0, sz); } void find(ll i, vector<ll> &res, ll x, ll lx, ll rx){ for(auto it : v[x]) res.pb(it); if(rx - lx == 1) return; ll mid = lx + (rx - lx) / 2; if(i < mid) find(i, res, 2 * x + 1, lx, mid); else find(i, res, 2 * x + 2, mid, rx); } vector<ll> find(ll i, vector<ll> &res){ find(i, res, 0, 0, sz); return res; } }; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for(int i = 1; i <= n; i++) cin >> a[i].ff >> a[i].sd; segtree s; s.init(); ds ss; ss.init(); sort(a + 1, a + n + 1); ll ans = 1; vector<ll> v; for(int i = n; i >= 1; i--){ v.clear(); s.find(a[i].sd, v); val[i] = 1; for(auto it : v) ss.merge(i, it); // for(auto it : v) cout << i << ' ' << it << '\n'; if(a[i - 1].ff != a[i].ff){ for(int j = i; j <= n and a[j].ff == a[i].ff; j++) s.set(a[j].ff + 1, a[j].sd, j); } } for(int i = 0; i < ss.sz; i++) ans = ans * 2 % mod; 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...