Submission #943042

#TimeUsernameProblemLanguageResultExecution timeMemory
943042salmonA Difficult(y) Choice (BOI21_books)C++14
100 / 100
8 ms1368 KiB
#include <bits/stdc++.h> #include "books.h" using namespace std; void solve(int N, int K, long long A, int S) { long long int lst[100100]; long long int sum = 0; for(int i = 1; i <= N; i++){ lst[i] = -1; } for(int i = 1; i <= K; i++){ lst[i] = skim(i); sum += lst[i]; } if(sum > A * 2){ impossible(); } else if(sum >= A){ vector<int> v; for(int i = 1; i <= K; i++){ v.push_back(i); } answer(v); } else{ vector<int> v; int s = 1; int e = N + 1; while(s != e){ int m = (s + e) / 2; long long int v; if(lst[m] != -1) v = lst[m]; else v = skim(m); lst[m] = v; if(v >= A){ e = m; } else{ s = m + 1; } } if(s < K){ impossible(); return; } if(s != N + 1){ long long int tomp; if(lst[s] == -1) tomp = skim(s); else tomp = lst[s]; lst[s] = tomp; if(sum - lst[K] + tomp <= A * 2){ for(int i = 1; i <= K - 1; i++){ v.push_back(i); } v.push_back(s); answer(v); return; } N = s - 1; } set<int> sat; for(int i = 1; i <= K; i++){ sat.insert(i); } for(int i = 0; i < K; i++){ sat.erase(K - i); sat.insert(N - i); long long int vo; if(lst[N - i] != -1) vo = lst[N - i]; else vo = skim(N - i); lst[N - i] = vo; sum -= lst[K - i]; sum += vo; if(A <= sum && sum <= A * 2){ for(int i : sat){ v.push_back(i); } answer(v); 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...