Submission #1235086

#TimeUsernameProblemLanguageResultExecution timeMemory
1235086Zbyszek99Parachute rings (IOI12_rings)C++20
100 / 100
1160 ms261352 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define ull unsigned long long #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define vi vector<int> #define vl vector<long long> #define pb push_back #define rep(i, b) for(int i = 0; i < (b); ++i) #define rep2(i,a,b) for(int i = a; i <= (b); ++i) #define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c) #define count_bits(x) __builtin_popcountll((x)) #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define forall(it,x) for(auto& it:(x)) using namespace __gnu_pbds; using namespace std; typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; //mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll los(ll a, ll b) {return a + (mt() % (b-a+1));} const int INF = 1e9+50; const ll INF_L = 1e18+40; const ll MOD = 1e9+7; const int maxn = 1000'001; int n; vi graph[maxn]; set<int> out_edges[maxn]; int cnt[maxn]; int my_bad[maxn]; bool is_in[maxn]; bool is_in_c[maxn]; int rep_[maxn]; int cur_not_good; int four = -1; bool is_four = 1; bool is_zero = 0; bool is_cycle = 0; set<int> on; int fint(int v) { if(rep_[v] == v) return v; rep_[v] = fint(rep_[v]); return rep_[v]; } void onion(int a, int b) { rep_[fint(a)] = fint(b); } void add_one(int v) { if(!is_in[v]) return; cnt[my_bad[v]]--; my_bad[v]++; cnt[my_bad[v]]++; } void Init(int N) { n = N; cnt[0] = n; rep(i,n) { is_in[i] = 1; rep_[i] = i; } } vi cycle; bool odw[maxn]; bool find_cycle(int v, int dest) { cycle.pb(v); if(v == dest) return 1; odw[v] = 1; forall(it,graph[v]) { if(odw[it] == 0) { bool w = find_cycle(it,dest); if(w) return w; } } cycle.pop_back(); return 0; } vector<pii> opers; void set_four(int v) { four = v; rep(i,n) { rep_[i] = i; graph[i] = {}; } forall(it,opers) { if(it.ff == v || it.ss == v) continue; if(fint(it.ff) == fint(it.ss)) { is_four = 0; } graph[it.ff].pb(it.ss); graph[it.ss].pb(it.ff); onion(it.ff,it.ss); if(siz(graph[it.ff]) > 2 || siz(graph[it.ss]) > 2) { is_four = 0; } } } void Link(int A, int B) { opers.pb({A,B}); if(is_zero) return; if(four != -1) { if(A == four || B == four) return; if(fint(A) == fint(B)) { is_four = 0; return; } graph[A].pb(B); graph[B].pb(A); onion(A,B); if(siz(graph[A]) > 2 || siz(graph[B]) > 2) { is_four = 0; } return; } if(siz(graph[A]) == 2) { add_one(A); cur_not_good++; } if(siz(graph[B]) == 2) { add_one(B); cur_not_good++; } if(siz(graph[A]) == 3) { set_four(A); return; } if(siz(graph[B]) == 3) { set_four(B); return; } graph[A].pb(B); graph[B].pb(A); out_edges[A].insert(B); out_edges[B].insert(A); if(is_cycle) { if(fint(A) == fint(B)) { int is1 = (is_in_c[A] == 1); int is2 = (is_in_c[B] == 1); if(is1 + is2 == 0) { is_zero = 1; return; } if(is1 + is2 == 1) { if(is_in[A]) { vi to_del; forall(it,on) { if(it == A) continue; if(out_edges[it].find(B) == out_edges[it].end() || out_edges[it].find(A) == out_edges[it].end()) { to_del.pb(it); } } forall(it,to_del) { on.erase(on.find(it)); cnt[my_bad[it]]--; is_in[it] = 0; } } if(is_in[B]) { vi to_del; forall(it,on) { if(it == B) continue; if(out_edges[it].find(A) == out_edges[it].end() || out_edges[it].find(B) == out_edges[it].end()) { to_del.pb(it); } } forall(it,to_del) { on.erase(on.find(it)); cnt[my_bad[it]]--; is_in[it] = 0; } } } if(is1 + is2) { vi to_del; forall(it,on) { if(it == A || it == B) continue; cnt[my_bad[it]]--; is_in[it] = 0; } forall(it,to_del) on.erase(on.find(it)); } } } else { if(fint(A) == fint(B)) { is_cycle = 1; find_cycle(A,B); rep(i,n) { cnt[my_bad[i]]--; is_in[i] = 0; } forall(it,cycle) { is_in[it] = 1; cnt[my_bad[it]]++; on.insert(it); is_in_c[it] = 1; } } } onion(A,B); if(siz(graph[A]) > 2) { forall(it,graph[A]) { add_one(it); } } if(siz(graph[B]) > 2) { forall(it,graph[B]) { add_one(it); } } } int CountCritical() { // cerr << is_zero << " " << four << " " << cnt[cur_not_good] << " " << is_cycle << " ans\n"; if(is_zero) return 0; if(four != -1) { if(is_four) return 1; return 0; } return cnt[cur_not_good]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...