Submission #340241

#TimeUsernameProblemLanguageResultExecution timeMemory
340241KerimRice Hub (IOI11_ricehub)C++17
100 / 100
201 ms3308 KiB
#include "bits/stdc++.h"
#include "ricehub.h"
#define MAXN 100009
#define INF 1000000007
#define mp(x,y) make_pair(x,y)
#define all(v) v.begin(),v.end()
#define pb(x) push_back(x)
#define wr cout<<"----------------"<<endl;
#define ppb() pop_back()
#define tr(ii,c) for(typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++)
#define ff first
#define ss second
 
using namespace std;
 
typedef long long ll;
typedef pair<int,int> PII;
template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;}
template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;}
const int error=0xFFFFFFF;
int n,l,mx=1;
ll b;
ll arr[MAXN],par[MAXN];
ll sum(int left,int right){
	return par[right]-par[left-1];
}
int ok(int type,int ind,int x){
	int st=0,en=x;
	while(st+1<en){
		int mid=(st+en)>>1;
		int dim=x-mid;
		ll budget=0;
		ll pul=0;
		if(ind-dim<1){
			st=mid;
			continue;
		}
		if(ind+mid-1>n){
			en=mid;	
			continue;
		}
		if(dim)
			budget=(dim*arr[ind]-sum(ind-dim,ind-1));
		if(mid)
			pul=(sum(ind,ind+mid-1)-mid*arr[ind]);
		if(pul+budget<=b)
			return 1;
		if(type==1)	
			en=mid;	
		else
			st=mid;
	}
	for(int mid=st;mid<=en;mid++){
		int dim=x-mid;
		ll budget=0;
		ll pul=0;
		if(ind-dim<1 or ind+mid-1>n)
			continue;
		if(dim)
			budget=(dim*arr[ind]-sum(ind-dim,ind-1));
		if(mid and ind+mid-1<=n)
			pul=(sum(ind,ind+mid-1)-mid*arr[ind]);
		if(pul+budget<=b)
			return 1;
	}
	return 0;
}
int go(int x){
	int st=1,en=n;
	while(st+1<en){
		int mid=(st+en)>>1;
		if(ok(1,x,mid) or ok(2,x,mid))
			st=mid;
		else
			en=mid;	
	}
	for(int i=en;i>=st;i--)
		if(ok(1,x,i) or ok(2,x,i))
			return i;
	return error;		
}

int besthub(int R, int L, int X[], long long B){
	n=R;l=L;b=B;
	for(int i=0;i<n;i++)
		arr[i+1]=X[i];
	for(int i=1;i<=n;i++)
		par[i]=par[i-1]+arr[i];
	for(int i=1;i<=n;i++)
		umax(mx,go(i));
  return mx;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...