Submission #1308584

#TimeUsernameProblemLanguageResultExecution timeMemory
1308584TymondICC (CEOI16_icc)C++20
61 / 100
97 ms628 KiB
#include "icc.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; #define fi first #define se second #define vi vector<int> #define vll vector<long long> #define pii pair<int, int> #define pll pair<long long, long long> #define pb push_back #define mp make_pair #define eb emplace_back #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); mt19937_64 rng64(chrono::high_resolution_clock::now().time_since_epoch().count()); inline int rand(int l,int r){return uniform_int_distribution<int>(l, r)(rng);} inline ll rand(ll l,ll r){return uniform_int_distribution<ll>(l, r)(rng64);} #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif struct custom_hash { static uint64_t splitmix64(uint64_t x) { x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; struct pair_hash{ size_t operator()(const pair<int,int>&x)const{ return hash<long long>()(((long long)x.first)^(((long long)x.second)<<32)); } }; int MAXN = 102; int ask(vi x, vi y){ if(sz(x) == 0 || sz(y) == 0){ return 0; } int A[MAXN]; int B[MAXN]; for(int i = 0; i < sz(x); i++){ A[i] = x[i]; } for(int i = 0; i < sz(y); i++){ B[i] = y[i]; } return query(sz(x), sz(y), A, B); } void run(int N){ int n = N; vector<vi> a(n + 1, vi()); vi rep(n + 1); for(int i = 1; i <= n; i++){ rep[i] = i; a[i].pb(i); } for(int _ = 1; _ < n; _++){ vi x = {}; vi y = {}; vi xd = {0, 1, 2, 3, 4, 5, 6}; shuffle(all(xd), rng); int ksor = 0; for(auto j : xd){ x = {}; y = {}; for(int i = 1; i <= n; i++){ if(rep[i] & (1 << j)){ x.pb(i); }else{ y.pb(i); } } if(ask(x, y)){ ksor += (1 << j); } } int repA = 0; int repB = 0; int X = 1; for(auto j : xd){ if((1 << j) & ksor){ X = (1 << j); } } repA = X; for(auto j : xd){ if((1 << j) == X){ continue; } if((1 << j) & ksor){ vi x1 = {}; vi y1 = {}; for(int i = 1; i <= n; i++){ if(rep[i] == i){ if(X & i){ if((1 << j) & i){ for(auto ele : a[i]){ x1.pb(ele); } } }else{ if(((1 << j) & i) == 0){ for(auto ele : a[i]){ y1.pb(ele); } } } } } if(ask(x1, y1)){ repA += (1 << j); }else{ repB += (1 << j); } }else{ vi x1 = {}; vi y1 = {}; for(int i = 1; i <= n; i++){ if(rep[i] == i){ if(X & i){ if(((1 << j) & i) == 0){ for(auto ele : a[i]){ x1.pb(ele); } } }else{ if(((1 << j) & i) == 0){ for(auto ele : a[i]){ y1.pb(ele); } } } } } if(!ask(x1, y1)){ repB += (1 << j); repA += (1 << j); } } } x = a[repA]; y = a[repB]; int A = -1; int B = -1; int l = 0; int p = sz(x) - 1; int mid; while(l <= p){ mid = (l + p) / 2; vi nx = {}; for(int j = 0; j <= mid; j++){ nx.pb(x[j]); } if(ask(nx, y)){ A = x[mid]; p = mid - 1; }else{ l = mid + 1; } } l = 0; p = sz(y) - 1; while(l <= p){ mid = (l + p) / 2; vi ny = {}; for(int j = 0; j <= mid; j++){ ny.pb(y[j]); } if(ask(ny, x)){ p = mid - 1; B = y[mid]; }else{ l = mid + 1; } } setRoad(A, B); A = rep[A]; B = rep[B]; swap(A, B); if(sz(a[A]) < sz(a[B])){ swap(A, B); } for(auto ele : a[B]){ rep[ele] = A; a[A].pb(ele); } vi().swap(a[B]); } }
#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...