Submission #553993

#TimeUsernameProblemLanguageResultExecution timeMemory
553993Sam_a17A Difficult(y) Choice (BOI21_books)C++14
100 / 100
42 ms460 KiB
#include <bits/stdc++.h> #include "books.h" using namespace std; const int M = 1e5 + 10; long long a[M]; void solve(int N, int K, long long A, int S) { /* // TODO implement this function if (skim(2) == 42) { impossible(); } else { answer({1, 3}); } */ set<pair<long long, int>> dig; // first K elements long long s = 0; for(int i = 1; i <= K; i++) { a[i] = skim(i); s += a[i]; dig.insert({a[i], i}); } if(s > 2 * A) { impossible(); } if(s >= A && s <= 2 * A) { vector<int> answ; for(int i = 1; i <= K; i++) { answ.push_back(i); } answer(answ); } int ina = K, inb = N, answ = -1; while(ina <= inb) { int mid = (ina + inb) / 2; a[mid] = skim(mid); if(a[mid] >= A) { answ = mid; inb = mid - 1; } else { ina = mid + 1; } } if(answ != -1) { long long curr = s - a[K] + a[answ]; if(curr >= A && curr <= 2 * A) { vector<int> v; for(int i = 1; i < K; i++) { v.push_back(i); } v.push_back(answ); answer(v); } answ--; } else { answ = N; } int cnt = 0; while(cnt < K && answ > 0) { dig.insert({skim(answ), answ}); cnt++, answ--; } vector<pair<long long, int>> digi; for(auto u: dig) { digi.push_back(u); } /* if(si < A) { impossible(); } */ assert(dig.size() <= 20); int n = digi.size(); for(int mask = 0; mask < (1 << n); mask++) { int ct = __builtin_popcount(mask); if(ct != K) continue; long long sx = 0; vector<int> vi; for(int i = 0; i < n; i++) { if(mask & (1 << i)) { sx += digi[i].first; sx = min(sx, 2 * A + 2); vi.push_back(digi[i].second); } } if(sx >= A && sx <= 2 * A) { answer(vi); } } impossible(); }
#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...