Submission #514946

#TimeUsernameProblemLanguageResultExecution timeMemory
514946kostia244Minerals (JOI19_minerals)C++17
85 / 100
54 ms2736 KiB
#include "minerals.h" #include<bits/stdc++.h> #define all(x) begin(x), end(x) using namespace std; bitset<90000> on; int uwusgi(int x) { on.flip(x); return Query(x); } #define Query uwusgi void Solve(int N) { vector<int> A, B, C(N), V; { mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); vector<int> ord(2*N); iota(all(ord), 1); shuffle(all(ord), rng); int lst = 0; for(auto i : ord) { int cc = Query(i); if(cc == lst) { V.push_back(A.size()); } (cc==lst ? B : A).push_back(i); lst = cc; } } // int CC = 0; for(int b = 0; b < 16; b++) { int lst = 0; for(int i = 0; i < N; i++) if(((i>>b)&1)^on[A[i]]) lst = Query(A[i]); vector<int> cnt(1<<16), cnto(1<<16); for(auto i : C) cnt[i]++; for(int i = 0; i < 1<<b; i++) { for(int j = 0; j < 1<<(16-b); j++) { int c = i | (j<<b); if(c<N) cnto[i] += j&1; } } for(int i = 0; i < N; i++) { if((C[i]|(1<<b)) > V[i] || !cnto[C[i]]) {cnt[C[i]]--;continue;} if(cnto[C[i]]) { int qq = -1; if(cnto[C[i]] == cnt[C[i]] && lst != qq) qq = lst;//cout << "HEY"<<endl; else qq = Query(B[i]); if(lst == qq) cnto[C[i]]--; C[i] |= (lst == qq)<<b; lst = qq; } else { C[i] |= cnto[C[i]]<<b; cnto[C[i]]--; } cnt[C[i]]--; } // for(auto i : C) cout << i << " "; cout << endl; } for(int i = 0; i < N; i++) Answer(A[C[i]], B[i]); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...