제출 #1224434

#제출 시각아이디문제언어결과실행 시간메모리
1224434SpyrosAlivA Difficult(y) Choice (BOI21_books)C++20
0 / 100
1 ms1176 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; #define ll long long int n, k, s; ll a; void solve(int N, int K, ll A, int S) { n = N; k = K; a = A; s = S; vector<ll> arr(n+1); for (int i = 1; i <= k; i++) { arr[i] = skim(i); } ll currS = 0; vector<int> index(k+2); for (int i = 1; i <= k; i++) { currS += arr[i]; index[i] = i; } index[k+1] = n+1; for (int curr = k; curr >= 1; curr--) { if (currS >= a && currS <= 2*a) break; int allow = index[curr+1] - 1; if (allow == curr) continue; int lo = curr+1, hi = allow; int idx = -1; while (lo <= hi) { int mid = (lo + hi) / 2; ll val = skim(mid); ll tot = currS - arr[curr] + val; if (tot >= a && tot <= 2 * a) { index[curr] = mid; vector<int> fin; for (int i = 1; i <= k; i++) { fin.push_back(index[i]); } answer(fin); return; } if (tot > 2 * a) { hi = mid-1; } else { idx = mid; lo = mid+1; } } if (idx == -1) { impossible(); return; } currS -= arr[curr]; currS += arr[idx]; index[curr] = idx; } if (currS > 2 * a || currS < a) { impossible(); return; } else { vector<int> fin; for (int i = 1; i <= k; i++) { fin.push_back(index[i]); } answer(fin); return; } }
#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...