Advertisement
YEZAELP

PROG-1107: Jump

Jun 9th, 2021
930
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.35 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int N = 1e6;
  5. const int INF = 1e9;
  6. using pii = pair <int, int>;
  7. pii ar[N+10]; // value, position
  8. bool pst[N+10];
  9. int n, K, P;
  10.  
  11. bool compare(pii a, pii b){
  12.     return a.first > b.first;
  13. }
  14.  
  15. bool check(){
  16.     int k = 0, prev = -1;
  17.     for(int i=1;i<=n;i++){
  18.         if(pst[i]){
  19.             if(prev == -1){
  20.                 k ++;
  21.                 prev = i;
  22.                 if(k > K) return false;
  23.             }
  24.             else if(i - prev + 1 == P){
  25.                 prev = -1;
  26.             }
  27.             else if(i - prev + 1 > P){
  28.                 k ++;
  29.                 prev = i;
  30.                 if(k > K) return false;
  31.             }
  32.         }
  33.     }
  34.     return true;
  35. }
  36.  
  37. int main(){
  38.  
  39.    scanf("%d%d%d", &n, &K, &P);
  40.  
  41.     for(int i=1;i<=n;i++){
  42.         int x;
  43.         scanf("%d", &x);
  44.         ar[i] = {x, i};
  45.     }
  46.  
  47.     sort(ar+1, ar+n+1, compare);
  48.  
  49.     int l = 1, r = n, mx = -INF;
  50.     while(l <= r){
  51.         int mid = (l + r) / 2;
  52.         for(int i = 1; i <= n; i ++) pst[i] = false;
  53.         for(int i = 1; i <= mid; i ++) pst[ ar[i].second ] = true;
  54.         if(!check()){
  55.             mx = max(mx, ar[mid].first);
  56.             r = mid - 1;
  57.         }
  58.         else l = mid + 1;
  59.     }
  60.  
  61.     if(mx == -INF) printf("%d", ar[n].first);
  62.     else printf("%d", mx);
  63.  
  64.     return 0;
  65. }
  66.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement