Submission #101747

#TimeUsernameProblemLanguageResultExecution timeMemory
101747hugo_pmPort Facility (JOI17_port_facility)C++17
100 / 100
2000 ms124856 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define form2(i, a, b) for (int i = (a); i < (b); ++i) #define ford2(i, a, b) for (int i = (a-1); i >= b; --i) #define form(i, n) form2(i, 0, n) #define ford(i, n) ford2(i, n, 0) #define chmax(x, v) x = max(x, (v)) #define chmin(x, v) x = min(x, (v)) #define fi first #define se second const long long BIG = 1000000000000000000LL; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; void cpr(string s, vector<int> v) { int i = 0; for (char c : s) { if (c == '$') cout << v[i++]; else cout << c; } cout << '\n'; } void cpr(string s) { cpr(s, {}); } void solve(); signed main() { ios::sync_with_stdio(false); cin.tie(0); solve(); return 0; } const int borne = 2 * ((int)(1e6) + 5); // MODIF POUR OJ !!! const int MOD = (int)(1e9) + 7; int nbCas; pii cas[borne]; // Union-find int par[borne]; int sz[borne]; void duInit() { form(i, borne) { par[i] = i; sz[i] = 1; } } int duFind(int x) { if (par[x] == x) return x; return par[x] = duFind(par[x]); } void duUnir(int a, int b) { a = duFind(a); b = duFind(b); if (a == b) return; if (sz[a] < sz[b]) swap(a, b); // a devient gros par[b] = a; sz[a] += sz[b]; } // Fin map<int, int> endToCas; void solve() { duInit(); cin >> nbCas; form(i, nbCas) cin >> cas[i].fi >> cas[i].se; sort(cas, cas+nbCas); form(cur, nbCas) { int gauche = cas[cur].fi, droite = cas[cur].se; auto deb = endToCas.lower_bound(gauche); auto mur = endToCas.lower_bound(droite); if (mur != endToCas.begin()) { auto fin = mur; --fin; while (deb != mur) { duUnir(cur, deb->se + nbCas); duUnir(cur + nbCas, deb->se); if (duFind(deb->se) == duFind(fin->se)) break; ++deb; } } endToCas[droite] = cur; } int ans = 1; form(caisse, nbCas) { if (duFind(caisse) == caisse) { ans *= 2; ans %= MOD; } // Non-biparti if (duFind(caisse) == duFind(caisse + nbCas)) { cout << "0\n"; return; } } cout << ans << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...