Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int INF = 1e9;
- const int N = 1e5 + 10;
- int ar[N], qsL[N], qsR[N];
- int n, m, k;
- bool check(int limit){
- int MinPst = INF, MaxPst = -INF;
- for(int i=1;i<=n;i++)
- if(ar[i] > limit) MinPst = min(MinPst, i), MaxPst = max(MaxPst, i);
- if(MinPst != INF and MaxPst != -INF and MaxPst - MinPst + 1 > m) return false;
- /// [1, MinPst) + (MaxPst, n]
- if(MinPst != 1){
- qsL[1] = 1;
- int SumL = ar[1], cntL = 1, preL = 1;
- for(int i = 2; i < min(MinPst, n+1); i ++){
- if(SumL + ar[i] <= limit and i - preL + 1 <= m) SumL += ar[i];
- else SumL = ar[i], cntL ++, preL = i;
- qsL[i] = cntL;
- }
- }
- if(MaxPst != n){
- qsR[n] = 1;
- int SumR = ar[n], cntR = 1, preR = n;
- for(int i = n-1; i > max(MaxPst, 0); i --){
- if(SumR + ar[i] <= limit and preR - i + 1 <= m) SumR += ar[i];
- else SumR = ar[i], cntR ++, preR = i;
- qsR[i] = cntR;
- }
- }
- /// m = len
- int st = max(1, MaxPst - m + 1), ed = min(st + m - 1, n);
- while(st <= MinPst and ed <= n){
- if(qsL[st-1] + qsR[ed+1] < k) return true;
- st ++, ed ++;
- }
- return false;
- }
- int main(){
- scanf("%d%d%d", &n, &m, &k);
- for(int i=1;i<=n;i++)
- scanf("%d", &ar[i]);
- int l = 0, r = INF, mn = INF;
- while(l <= r){
- int mid = (l + r) / 2;
- bool ch = check(mid);
- if(ch){
- r = mid - 1;
- mn = min(mn, mid);
- }
- else
- l = mid + 1;
- }
- printf("%d", mn);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement