Submission #1308576

#TimeUsernameProblemLanguageResultExecution timeMemory
1308576TymondICC (CEOI16_icc)C++20
90 / 100
81 ms632 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); 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(j == xd.back() || ask(x, y)){ break; } } int A = -1; int B = -1; shuffle(all(x), rng); 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; } } shuffle(all(y), rng); 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...