Submission #384392

#TimeUsernameProblemLanguageResultExecution timeMemory
384392patrikpavic2Xoractive (IZhO19_xoractive)C++17
100 / 100
5 ms512 KiB
#include "interactive.h" #include <vector> #include <cstdio> #include <algorithm> #define PB push_back using namespace std; typedef vector < int > vi; vi razlika(vi &A, vi &B){ int i = 0, j = 0; vi ret; for(;i < (int)A.size() || j < (int)B.size();){ if(i == (int)A.size() || (j < (int)B.size() && B[j] < A[i])) ret.PB(B[j++]); else if(j == (int)B.size() || (i < (int)A.size() && B[j] > A[i])) ret.PB(A[i++]); else i++, j++; } return ret; } vi presjek(vi &A, vi &B){ int i = 0, j = 0; vi ret; for(;i < (int)A.size() && j < (int)B.size();){ if(B[j] < A[i]) j++; else if(B[j] > A[i]) i++; else ret.PB(A[i++]), j++; } return ret; } int jen; vi saznaj(vi pos){ if((int)pos.size() == 0) return {}; vi A, B, C, ret; A = get_pairwise_xor(pos); pos.PB(1); B = get_pairwise_xor(pos); C = razlika(A, B); for(int i = 1;i < (int)C.size();i += 2) ret.PB(C[i] ^ jen); sort(ret.begin(), ret.end()); return ret; } vi B[2][10], svi; const int BIT = 7; const double KOF = 1.618; const int N = 105; int msk[N]; void generate(int l, int r, int raz){ if(raz == BIT) return; if(r <= l) return; int mid = (int)((double)(l + r) / KOF); mid = min(max(mid, l), r - 1); for(int i = l;i <= mid;i++) { // printf("%d u %d\n", i, raz); msk[i] += (1 << raz); } generate(l, mid, raz + 1); generate(mid + 1, r, raz + 1); } vi guess(int n) { // printf("TU SAM\n"); vi ans; jen = ask(1); for(int i = 2;i <= n;i++) svi.PB(i); //svi = saznaj(svi); //generate(2, n, 0); for(int i = 2;i <= n;i++) msk[i] = 127 - i; for(int i = 0;i < BIT;i++){ vi Q; for(int j = 2;j <= n;j++){ if(msk[j] & (1 << i)) Q.PB(j); } B[1][i] = saznaj(Q); //B[0][i] = razlika(svi, B[1][i]); } // printf("TU SAM n = %d\n", n); ans.PB(jen); for(int i = 2;i <= n;i++){ vi cur; for(int j = 0;j < BIT;j++){ // printf("pozivam presjek\n"); if(msk[i] & (1 << j)){ if((int)cur.size() == 0) cur = B[1][j]; else cur = presjek(cur, B[1][j]); } // printf("gotov presjek\n"); } //printf("i = %d cur = %d\n", i, (int)cur.size()); int ja = cur[0]; ans.PB(ja); vi pos; pos.PB(ja); svi = razlika(svi, pos); //printf("A[ %d ] = %d\n", i, ja); for(int j = 0;j < BIT;j++){ if(msk[i] & (1 << j)) B[1][j] = razlika(B[1][j], pos); } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...