제출 #717785

#제출 시각아이디문제언어결과실행 시간메모리
717785adrilenA Difficult(y) Choice (BOI21_books)C++17
5 / 100
245 ms596 KiB
#include<bits/stdc++.h> using namespace std; using ll = unsigned long long; typedef pair<int, int> pii; #include "books.h" constexpr int maxn = 1e5 + 5; int n; ll v[maxn + 1] = { 0 }, pref[maxn + 1] = { 0 }; bool correct; int fnd(int k, ll lower, ll upper) { correct = false; int l = 0, u = n - k, mid; ll val; // cout << lower << " " << upper << "\n"; while (l != u) { mid = (l + u) >> 1; val = pref[mid + k] - pref[mid]; // cout << val << " "; if (val < lower) l = mid + 1; else if (val > upper) u = mid; else { correct = true; // cout << "\n"; return mid; } } // cout << "\n"; return l; } void solve(int N, int k, long long A, int s) { n = N; if (s != n) impossible(); for (int i = 1; i <= n; i++) v[i] = skim(i); for (int i = 1; i <= n; i++) { pref[i] = pref[i - 1] + v[i]; if (pref[i] >= (7ull << 61)) pref[i] = (7ull << 61); } vector <int> output; ll lower = A, upper = 2 * A; int nk = k; int p; while (output.size() != (ll)k) { p = fnd(nk, lower, upper); // cout << p << " " << v[p + nk] << "\n"; if (v[p + nk] > upper) impossible(); if (correct) { while (output.size() != (ll)k) output.emplace_back(++p); upper = lower = 0; } else { if (!output.empty() && output.back() == p + nk) impossible(); output.emplace_back(p + nk); upper -= v[p + nk]; if (lower <= v[p + nk]) lower = 0; else lower -= v[p + nk]; nk--; } } if (lower != 0) impossible(); answer(output); }
#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...