Submission #1258574

#TimeUsernameProblemLanguageResultExecution timeMemory
1258574Zbyszek99ICC (CEOI16_icc)C++20
100 / 100
84 ms632 KiB
#include <bits/stdc++.h> #include "icc.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; int ask(vi a, vi b) { if(siz(a) == 0 || siz(b) == 0) return 0; int a2[siz(a)]; int b2[siz(b)]; rep(i,siz(a)) a2[i] = a[i]; rep(i,siz(b)) b2[i] = b[i]; return query(siz(a),siz(b),a2,b2); } int rep_[101]; vi comp_list[101]; void onion(int a, int b) { a = rep_[a]; b = rep_[b]; if(siz(comp_list[a]) > siz(comp_list[b])) swap(a,b); forall(it,comp_list[a]) { comp_list[b].pb(it); rep_[it] = b; } } void run(int n) { rep2(i,1,n) rep_[i] = i; rep2(i,1,n) comp_list[i] = {i}; rep(t,n-1) { vector<vi> comps; rep2(i,1,n) if(rep_[i] == i) comps.pb(comp_list[i]); int bits = __lg(siz(comps)); if((1 << bits) != siz(comps)) bits++; vi lset; vi rset; int xor_ = 0; rep(bit,bits) { vi a; vi b; rep(i,siz(comps)) { if((1 << bit) & i) forall(it,comps[i]) a.pb(it); else forall(it,comps[i]) b.pb(it); } if(ask(a,b)) { lset = a; rset = b; xor_ += (1 << bit); } } int l = 0; int r = siz(rset)-2; int u = rset.back(); while(l <= r) { int mid = (l+r)/2; vi q; rep(i,mid+1) q.pb(rset[i]); if(ask(lset,q)) { u = rset[mid]; r = mid-1; } else { l = mid+1; } } int ind = 0; rep2(i,1,n) { if(rep_[i] == i && rep_[i] == rep_[u]) break; if(rep_[i] == i) ind++; } int c2 = ind^xor_; ind = 0; rep2(i,1,n) { if(rep_[i] == i) { if(ind == c2) { c2 = rep_[i]; break; } ind++; } } l = 0; r = siz(comp_list[c2])-2; int v = comp_list[c2].back(); while(l <= r) { int mid = (l+r)/2; vi q; rep(i,mid+1) q.pb(comp_list[c2][i]); if(ask(q,{u})) { v = comp_list[c2][mid]; r = mid-1; } else { l = mid+1; } } onion(u,v); setRoad(u,v); } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...