제출 #1235072

#제출 시각아이디문제언어결과실행 시간메모리
1235072Zbyszek99낙하산 고리들 (IOI12_rings)C++20
37 / 100
1360 ms252816 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]; int rep_[maxn]; int cur_not_good; int four = -1; int four_cnt = 0; 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; } void Link(int A, int B) { if(is_zero) 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) { if(four == -1) { four_cnt = 1; forall(it,graph[A]) { if(siz(graph[it]) > 2) four_cnt++; } four = A; } else is_zero = 1; } if(siz(graph[B]) == 3) { if(four == -1) { four_cnt = 1; four = B; forall(it,graph[B]) { if(siz(graph[it]) > 2) four_cnt++; } } else is_zero = 1; } 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[A] == 1); int is2 = (is_in[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); } } } onion(A,B); if(four != -1) { if(A != four && siz(graph[A]) > 2) { forall(it,graph[A]) { if(it == four) four_cnt++; } } if(B != four && siz(graph[B]) > 2) { forall(it,graph[B]) { if(it == four) four_cnt++; } } } else { 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() { if(is_zero) return 0; if(four != -1) { if(four_cnt == cur_not_good && is_in[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...