Advertisement
YEZAELP

o61_mar_c2_chickentart

Jul 6th, 2021
1,329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int INF = 1e9;
  5. const int N = 1e5 + 10;
  6. int ar[N], qsL[N], qsR[N];
  7. int n, m, k;
  8.  
  9. bool check(int limit){
  10.  
  11.     int MinPst = INF, MaxPst = -INF;
  12.     for(int i=1;i<=n;i++)
  13.         if(ar[i] > limit) MinPst = min(MinPst, i), MaxPst = max(MaxPst, i);
  14.     if(MinPst != INF and MaxPst != -INF and MaxPst - MinPst + 1 > m) return false;
  15.  
  16.     /// [1, MinPst) + (MaxPst, n]
  17.  
  18.     if(MinPst != 1){
  19.         qsL[1] = 1;
  20.         int SumL = ar[1], cntL = 1, preL = 1;
  21.         for(int i = 2; i < min(MinPst, n+1); i ++){
  22.             if(SumL + ar[i] <= limit and i - preL + 1 <= m) SumL += ar[i];
  23.             else SumL = ar[i], cntL ++, preL = i;
  24.             qsL[i] = cntL;
  25.         }
  26.     }
  27.  
  28.     if(MaxPst != n){
  29.         qsR[n] = 1;
  30.         int SumR = ar[n], cntR = 1, preR = n;
  31.         for(int i = n-1; i > max(MaxPst, 0); i --){
  32.             if(SumR + ar[i] <= limit and preR - i + 1 <= m) SumR += ar[i];
  33.             else SumR = ar[i], cntR ++, preR = i;
  34.             qsR[i] = cntR;
  35.         }
  36.     }
  37.  
  38.     /// m = len
  39.     int st = max(1, MaxPst - m + 1), ed = min(st + m - 1, n);
  40.     while(st <= MinPst and ed <= n){
  41.         if(qsL[st-1] + qsR[ed+1] < k) return true;
  42.         st ++, ed ++;
  43.     }
  44.  
  45.     return false;
  46. }
  47.  
  48. int main(){
  49.  
  50.     scanf("%d%d%d", &n, &m, &k);
  51.  
  52.     for(int i=1;i<=n;i++)
  53.         scanf("%d", &ar[i]);
  54.  
  55.     int l = 0, r = INF, mn = INF;
  56.     while(l <= r){
  57.         int mid = (l + r) / 2;
  58.         bool ch = check(mid);
  59.         if(ch){
  60.             r = mid - 1;
  61.             mn = min(mn, mid);
  62.         }
  63.         else
  64.             l = mid + 1;
  65.     }
  66.  
  67.     printf("%d", mn);
  68.  
  69.     return 0;
  70.  
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement