Submission #1245669

#TimeUsernameProblemLanguageResultExecution timeMemory
1245669Zbyszek99Split the Attractions (IOI19_split)C++20
100 / 100
96 ms30536 KiB
#include "split.h" #include <bits/stdc++.h> #define ll long long #define ld long double #define vi vector<int> #define vl vector<long long> #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, 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 std; //mt19937 mt;void random(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll rand(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; vi ans; bool is_ans; int comp2; int comp1_siz = 0; int comp2_siz = 0; map<int,int> rel_comp; int lims[3]; vi graph[100001]; int pre[100001]; int sub[100001]; bool odw[100001]; int min_up[100001]; int cur_pre = 0; vi sons[100001]; int n; int dfs1(int v) { odw[v] = 1; sub[v] = 1; pre[v] = cur_pre++; min_up[v] = pre[v]; forall(it,graph[v]) { if(odw[it]) { min_up[v] = min(min_up[v],pre[it]); } else { sons[v].pb(it); sub[v] += dfs1(it); min_up[v] = min(min_up[v],min_up[it]); } } return sub[v]; } void dfs_set_ans(int v, int d) { if(comp1_siz < lims[d-1]) { ans[v] = d; comp1_siz++; } forall(it,sons[v]) { dfs_set_ans(it,d); } } void dfs_comp2(int v, int d) { if(comp2_siz < lims[d-1]) { ans[v] = d; comp2_siz++; } odw[v] = 1; forall(it,graph[v]) { if(odw[it] == 0) { dfs_comp2(it,d); } } } void dfs_ans(int v, int pop) { bool is = (sub[v] >= lims[0]); forall(it,sons[v]) { if(sub[it] >= lims[0]) is = 0; } if(is) { int my_sum = sub[v]; int up_sum = n-sub[v]; vi not_del; forall(it,sons[v]) { if(min_up[it] < pre[v] && my_sum-sub[it] >= lims[0]) { up_sum += sub[it]; my_sum -= sub[it]; } else { not_del.pb(it); } } if(up_sum >= lims[0]) { is_ans = 1; if(up_sum >= lims[1]) { ans[v] = 1; comp1_siz = 1; forall(it,not_del) { dfs_set_ans(it,1); } rep(i,n) odw[i] = 1; rep(i,n) if(ans[i] == 0) odw[i] = 0; dfs_comp2(pop,2); } else { ans[v] = 2; comp1_siz = 1; forall(it,not_del) { dfs_set_ans(it,2); } rep(i,n) odw[i] = 1; rep(i,n) if(ans[i] == 0) odw[i] = 0; dfs_comp2(pop,1); } } } else { forall(it,sons[v]) { dfs_ans(it,v); if(is_ans) return; } } } vi find_split(int N, int a, int b, int c, vi p, vi q) { n = N; ans.resize(n,0); vector<pii> xd = {{a,1},{b,2},{c,3}}; sort(all(xd)); rep(i,3) { rel_comp[i+1] = xd[i].ss; lims[i] = xd[i].ff; } rep(i,siz(p)) { graph[p[i]].pb(q[i]); graph[q[i]].pb(p[i]); } dfs1(0); dfs_ans(0,-1); if(!is_ans) return ans; rep(i,n) if(ans[i] == 0) ans[i] = 3; rep(i,n) ans[i] = rel_comp[ans[i]]; return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...