제출 #1176326

#제출 시각아이디문제언어결과실행 시간메모리
1176326peraRice Hub (IOI11_ricehub)C++20
17 / 100
0 ms328 KiB
#include<bits/stdc++.h>
#include "ricehub.h"
#define LL long long
using namespace std;
int besthub(int R , int L , int X[] , LL B){
   #define int long long
   vector<LL> p(R);
   for(int i = 0;i < R;i ++){
      if(i > 0){
         p[i] = p[i - 1];
      }
      p[i] += X[i];
   }
   auto range_sum = [&](int l , int r){
      if(l > r){
         return 0LL;
      }
      return p[r] - (l > 0 ? p[l - 1] : 0);
   };
   int ans = 0;
   for(int i = 0;i < R;i ++){
      int ll , rr;
      LL t = 0 , S = 0;
      for(int bit = 30;bit >= 0;bit --){
         t += 1 << bit;
         int l = i , r = i;
         for(int BIT = 20;BIT >= 0;BIT --){
            l -= 1 << BIT;
            if(l < 0 || X[l] < X[i] - t){
               l += 1 << BIT;
            }
            r += 1 << BIT;
            if(r >= R || X[r] > X[i] + t){
               r -= 1 << BIT;
            }
         }
         LL sL = (i - l) * X[i] - range_sum(l , i - 1);
         LL sR = range_sum(i + 1 , r) - (r - i) * X[i];
         if(sL + sR > B){
            t -= 1 << bit;
         }else{
            ll = l;
            rr = r;
            S = sL + sR;
         }
      }
      int old_l = ll , old_r = rr;
      ans = max(ans , rr - ll + 1);
      for(int bit = 20;bit >= 0;bit --){
         rr += 1 << bit;
         if(rr >= R){
            rr -= 1 << bit;
         }else{
            LL E = range_sum(old_r + 1 , rr) - (rr - old_r) * X[i];
            if(S + E > B){
               rr -= 1 << bit;
            }else{
               ans = max(ans , rr - old_l + 1);
            }
         }
         ll -= 1 << bit;
         if(ll < 0){
            ll += 1 << bit;
         }else{
            LL E = (old_l - ll) * X[i] - range_sum(ll , old_l - 1);
            if(S + E > B){
               ll += 1 << bit;
            }else{
               ans = max(ans , old_r - ll + 1);
            }
         }
      }
   }
   #undef int
   return (int)ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...