Submission #1264279

#TimeUsernameProblemLanguageResultExecution timeMemory
1264279liangjeremyRice Hub (IOI11_ricehub)C++20
100 / 100
155 ms7000 KiB
#include "ricehub.h"
#include<bits/stdc++.h>
#define fi first
#define se second
//#define int long long
using namespace std;
using db=double;
using ll=int64_t;
using sll=__int128;
using lb=long double;

int besthub(int n, int m, int a[], long long mx){
#define int long long
	vector<int>v(n+1); vector<int>prefix(n+1); 
	for(int i=0; i<n; i++){
		v[i+1]=a[i]; prefix[i+1]=v[i+1]+prefix[i];
	}
	int ans=0; unordered_map<int,int>mp; 
	for(int i=1; i<=n; i++)mp[v[i]]++; 
	auto check=[&](int mid, int idx){
		long long tot=0; 
		int lidx=lower_bound(v.begin()+1,v.end(),v[idx]-mid)-v.begin();
		int ridx=upper_bound(v.begin()+1,v.end(),v[idx]+mid)-v.begin()-1; 
		if(lidx<idx){
			tot+=v[idx]*(idx-lidx)-(prefix[idx-1]-prefix[lidx-1]); 
		}
		if(ridx>idx){
			tot+=(prefix[ridx]-prefix[idx])-v[idx]*(ridx-idx); 
		}
		return tot; 
	};
	for(int i=1; i<=n; i++){
		int left=0; int right=v[n]-v[1]; int amt=mx; 
		while(left<right){
			int mid=(left+right+1)>>1; 
			if(check(mid,i)<=mx)left=mid; else right=mid-1; 
		}
		int lidx=lower_bound(v.begin()+1,v.end(),v[i]-left)-v.begin();		
		int ridx=upper_bound(v.begin()+1,v.end(),v[i]+left)-v.begin()-1; 
		if(lidx<i){
			amt-=v[i]*(i-lidx)-(prefix[i-1]-prefix[lidx-1]); 
		}
		if(ridx>i){
			amt-=(prefix[ridx]-prefix[i])-v[i]*(ridx-i); 
		}
		int l=1e18; int r=1e18; int cur=ridx-lidx+1; 
		if(lidx-1>0)l=abs(v[i]-v[lidx-1]);
		if(ridx+1<=n)r=abs(v[i]-v[ridx+1]);  
		if(min(l,r)==1e18){
			ans=max(ans,cur); continue; 
		}
		if(l<r){
			cur+=min((int)(amt/l),mp[v[lidx-1]]); 
		}else if(r<l){
			cur+=min((int)(amt/r),mp[v[ridx+1]]); 
		}else if(r==l){
			cur+=min((int)(amt/r),mp[v[ridx+1]]+mp[v[lidx-1]]); 
		}
		ans=max(ans,cur); 
	}
#undef int 
	return 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...