Submission #1247066

#TimeUsernameProblemLanguageResultExecution timeMemory
1247066ErJSphinx's Riddle (IOI24_sphinx)C++20
64 / 100
38 ms912 KiB
#include "sphinx.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define vi vector<ll> #define vvi vector<vi> #define pp pair<ll, ll> #define vp vector<pp> vector<int> small(int n, std::vector<int> x, std::vector<int> y){ vector<int> ans(n); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ vector<int> query(n, j); query[i] = -1; ll x = perform_experiment(query); if(x == 1){ ans[i] = j; break; } } } return ans; } vector<int> complete(int n, vector<int> x, vector<int> y){ vector<int> ans(n); for(int i = 0; i < n; i++){ ll l = 0, r = n; while(l < r - 1){ vector<int> query(n, n); query[i] = -1; ll s = (l + r)/2; ll ind = l; for(int j = 0; j < n; j++){ if(i == j) continue; query[j] = ind; ind++; if(ind == s) break; } ll x = perform_experiment(query); if(x == s - l + 1) r = s; else l = s; } ans[i] = l; } return ans; } vector<int> sedL(ll n, ll l, ll r, ll c){ vector<int> ans(n, n); for(int i = l; i < r; i++){ if(i % 2 == 1){ ans[i] = c; }else{ ans[i] = -1; } } return ans; } vector<int> sedS(ll n, ll l, ll r, ll c){ vector<int> ans(n, n); for(int i = l; i < r; i++){ if(i % 2 == 0){ ans[i] = c; }else{ ans[i] = -1; } } return ans; } vector<int> find_colours(int n, std::vector<int> x, std::vector<int> y) { if(n <= 50) return small(n, x, y); if(x.size() == n*(n - 1) / 2) return complete(n, x, y); vector<int> ans(n); for(int i = 0; i < n; i++){ ll beg = 0; while(true){ ll l = beg, r = n; if(l >= r) break; bool spec = false; if(l == n - 1) { l--; spec = true; } vector<int> query = sedL(n, l, r, i); ll x = perform_experiment(query); ll expected = r - l + 2; if(l == 0) expected--; if(r == n) expected--; if(expected != x){ while(r - l > 2){ ll s = (l + r) / 2; if(s % 2 == 1) s++; query = sedL(n, l, s, i); x = perform_experiment(query); expected = s - l + 2; if(l == 0) expected--; if(s == n) expected--; if(x == expected) l = s; else r = s; if(l % 2 == 1) l++; if(r % 2 == 0) r--; } if(spec) { ans[l + 1] = i; break; } ans[l] = i; beg = l + 2; }else{ break; } } beg = 0; while(true){ ll l = beg, r = n; if(l >= r) break; bool spec = false; if(l == n - 1) { l--; spec = true; } vector<int> query = sedS(n, l, r, i); ll x = perform_experiment(query); ll expected = r - l + 2; if(l == 0) expected--; if(r == n) expected--; if(expected != x){ while(r - l > 2){ ll s = (l + r) / 2; if(s % 2 == 0) s++; query = sedS(n, l, s, i); x = perform_experiment(query); expected = s - l + 2; if(l == 0) expected--; if(s == n) expected--; if(x == expected) l = s; else r = s; if(l % 2 == 0) l++; if(r % 2 == 1) r--; } if(spec) { ans[l + 1] = i; break; } ans[l] = i; beg = l + 2; }else{ break; } } /*while(l < r - 1){ vector<int> query(n, n); query[i] = -1; ll s = (l + r)/2; ll ind = l; for(int j = 0; j < n; j++){ if(i == j) continue; query[j] = ind; ind++; if(ind == s) break; } ll x = perform_experiment(query); if(x == s - l + 1) r = s; else l = s; } ans[i] = l;*/ } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...