Submission #1207908

#TimeUsernameProblemLanguageResultExecution timeMemory
1207908mychecksedadPort Facility (JOI17_port_facility)C++20
0 / 100
94 ms196160 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30; struct Dsu{ vector<int> p, s; Dsu(int n){ s.resize(n+1, 1); p.resize(n+1); for(int i = 1; i <= n; ++i){ p[i] = i; } } int find(int v){ if(p[v] == v) return v; return p[v] = find(p[v]); } void merge(int a, int b){ a = find(a); b = find(b); if(a != b){ if(s[a] > s[b]) swap(a, b); s[b] += s[a]; p[a] = b; } } } d(N); int n; array<int, 2> a[N]; vi T[8*N]; void merg(int l, int r, int ql, int qr, int k, int v){ if(ql > r || l > qr) return; if(ql <= l && r <= qr){ // cerr << "merge: " << l << ' ' << r << '\n'; if(T[k].size()) d.merge(T[k][0], v); while(T[k].size() > 1){ d.merge(T[k].back(), T[k][0]); T[k].pop_back(); } return; } int mid = l+r>>1; merg(l, mid, ql, qr, k<<1, v); merg(mid+1, r, ql, qr, k<<1|1, v); } int check(int l, int r, int ql, int qr, int k){ if(ql > r || l > qr) return 2; if(ql <= l && r <= qr){ while(T[k].size() > 1){ if(T[k][0] != T[k].back()){ return -1; } T[k].pop_back(); } if(T[k].empty()) return 2; return T[k][0]; } int mid = l+r>>1; int x = check(l, mid, ql, qr, k<<1); int y = check(mid+1, r, ql, qr, k<<1|1); if(x == 2) return y; if(y == 2) return x; if(x == -1 || y == -1) return -1; if(x != y) return -1; return x; } void add(int l, int r, int p, int k, int v){ T[k].pb(v); // cerr << l << ' ' << r << ' ' << v << '\n'; if(l == r){ return; } int mid = l+r>>1; if(p <= mid) add(l, mid, p, k<<1, v); else add(mid+1, r, p, k<<1|1, v); } void solve(){ cin >> n; for(int i = 1; i <= n; ++i){ cin >> a[i][0] >> a[i][1]; } sort(a+1, a+1+n); for(int i = 1; i <= n; ++i){ add(1, n*2, a[i][1], 1, i); merg(1, n*2, a[i][0], a[i][1], 1, i); } // for(int i = 1; i <= n; ++i){ // cout << d.find(i) << ' '; // } // return; for(int i = 1; i <= n*8; ++i) T[i].clear(); for(int i = 1; i <= n; ++i){ int ok = check(1, 2*n, a[i][0], a[i][1], 1); // cout << ok << ' ' << i << '\n'; if(ok == -1){ cout << 0; return; } if(ok == 2) ok = 1; add(1, 2*n, a[i][1], 1, 1 - ok); } ll ans = 1; // for(int i = 1; i <= n; ++i){ // cerr << d.find(i) << '\n'; // } for(int i = 1; i <= n; ++i){ if(d.find(i) == i) (ans*=2)%=MOD; } cout << ans; } int main(){ cin.tie(0); ios::sync_with_stdio(0); int tt = 1, aa; // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(tt--){ solve(); en; } cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n"; 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...