Submission #414106

#TimeUsernameProblemLanguageResultExecution timeMemory
414106KoDA Difficult(y) Choice (BOI21_books)C++17
100 / 100
19 ms268 KiB
#include <bits/stdc++.h> #include "books.h" using ll = long long; template <class T> using Vec = std::vector<T>; void solve(int N, int K, ll A, int S) { int ok = N + 1, ng = 0; while (ok - ng > 1) { const int md = (ok + ng) / 2; (skim(md) >= A ? ok : ng) = md; } Vec<std::pair<ll, int>> cand; for (int i = 1; i <= std::min(K, ok - 1); ++i) { cand.emplace_back(skim(i), i); } for (int i = std::max(K + 1, ok - K); i <= ok - 1; ++i) { cand.emplace_back(skim(i), i); } if (ok <= N and (int) cand.size() >= K - 1) { const auto val = skim(ok); ll sum = 0; for (int i = 0; i < K - 1; ++i) { sum += cand[i].first; } if (sum + val <= 2 * A) { Vec<int> ans; for (int i = 0; i < K - 1; ++i) { ans.push_back(cand[i].second); } ans.push_back(ok); answer(ans); return; } } for (int set = 0; set < (1 << cand.size()); ++set) { if (__builtin_popcount(set) != K) { continue; } ll sum = 0; for (int i = 0; i < (int) cand.size(); ++i) { if (set >> i & 1) { sum += cand[i].first; } } if (A <= sum and sum <= 2 * A) { Vec<int> ans; for (int i = 0; i < (int) cand.size(); ++i) { if (set >> i & 1) { ans.push_back(cand[i].second); } } answer(ans); return; } } 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...