Submission #989470

#TimeUsernameProblemLanguageResultExecution timeMemory
989470steveonalexMechanical Doll (IOI18_doll)C++17
18 / 100
378 ms87660 KiB
#include <bits/stdc++.h> #include "doll.h" using namespace std; typedef long long ll; typedef unsigned long long ull; #define MASK(i) (1ULL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll LASTBIT(ll mask){return (mask) & (-mask);} int pop_cnt(ll mask){return __builtin_popcountll(mask);} int ctz(ull mask){return __builtin_ctzll(mask);} int logOf(ull mask){return 63 - __builtin_clzll(mask);} mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);} template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){ for(auto item: container) out << item << separator; out << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } void create_circuit(int m, vector<int> a); namespace Grader{ int n, m; vector<int> a; void answer(vector<int> C, vector<int> X, vector<int> Y){ cout << n << "\n"; if (X.size() > n + logOf(n) + 1) { cout << "Wrong answer! (switch limit exceeded)\n"; cout << "Switch used: " << X.size() << "\n"; exit(1); } cout << "Validating...\n"; int ball = 0; vector<int> ans; vector<bool> state(X.size()); while(ball != 0 || ans.empty()){ if (ball > 0) ans.push_back(ball); if (ball >= 0){ ball = C[ball]; } else { int cur = (-ball) - 1; if (state[cur]){ state[cur] = false; ball = Y[cur]; } else{ state[cur] = true; ball = X[cur]; } } } if (ans != a) cout << "Wrong answer! (incorrect sequence produced)\n"; else if (*max_element(ALL(state)) == 1) cout << "Wrong answer! (there exists an Y switch)\n"; else { cout << "Correct answer!\n"; cout << "Switch used: " << X.size() << "\n"; return; } exit(1); } void solve(){ // cin >> n >> m; n = rngesus(1, 1024), m = rngesus(1, 1); a = vector<int>(n); // for(int i = 0; i<n; ++i) cin >> a[i]; for(int i = 0; i<n; ++i) a[i] = rngesus(1, m); create_circuit(m, a); } } // using namespace Grader; void toss(vector<int> &a){ int n = a.size(); vector<int> st(n*2); for(int i: a){ int idx = 1; while(idx < n){ if (!st[idx]){ st[idx] = 1; idx = idx * 2; } else{ st[idx] = 0; idx = idx * 2 + 1; } } st[idx] = i; } for(int i = n; i<n*2; ++i) a[i-n] = st[i]; } void create_circuit(int m, vector<int> a) { vector<int> C(m+1, 0); vector<int> X, Y; int n = a.size(); for(int i = 1; i<=m; ++i) C[i] = -1; C[0] = a[0]; a.erase(a.begin()); int k = MASK(logOf(a.size()) + 1); vector<int> perm(k); for(int i = 0; i<k; ++i) perm[i] = i; a.push_back(0); n = a.size(); toss(perm); vector<int> b; for(int i = k-n; i < k; ++i) b.push_back(perm[i]); sort(ALL(b)); map<int, int> mp; for(int i = 0; i<b.size(); ++i) mp[b[i]] = a[i]; vector<int> kus(k, -1); for(int i = k-n; i<k; ++i) kus[i] = mp[perm[i]]; int cur = 0; vector<int> mariana(k); for(int j: kus) mariana.push_back(j); vector<vector<int>> v(k); for(int i= k; i<k*2; ++i){ int idx = i; while(idx > 1){ idx >>= 1; v[idx].push_back(mariana[i]); } } map<vector<int>, int> stu; for(int i = 1; i<k; ++i){ if (stu.count(v[i])){ mariana[i]= stu[v[i]]; } else{ mariana[i] = stu[v[i]] = --cur; } } while(X.size() < -cur){ X.push_back(0); Y.push_back(0); } for(int i = 1; i<k; ++i){ int pos = -mariana[i]-1; X[pos] = mariana[i * 2]; Y[pos] = mariana[i * 2 + 1]; } answer(C, X, Y); } // int main(void){ // ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); // int t; cin >> t; // for(int iteration = 1; iteration <= t; ++iteration) // solve(); // return 0; // }

Compilation message (stderr)

doll.cpp: In function 'void Grader::answer(std::vector<int>, std::vector<int>, std::vector<int>)':
doll.cpp:55:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   55 |         if (X.size() > n + logOf(n) + 1) {
      |             ~~~~~~~~~^~~~~~~~~~~~~~~~~~
doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:151:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  151 |     for(int i = 0; i<b.size(); ++i)
      |                    ~^~~~~~~~~
doll.cpp:179:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  179 |     while(X.size() < -cur){
      |           ~~~~~~~~~^~~~~~
#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...