# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1127367 | enzy | Rice Hub (IOI11_ricehub) | C++20 | 0 ms | 0 KiB |
#include "ricehub.h"
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18+10;
const int maxn=1e5+10;
int v[maxn], sp[maxn], n;
bool check(int x, int lim){
int cost=inf;
for(int i=0;i<=x;i++){
// vou checar se os i primeiros caras n existem e os x-i ultimos caras n existem tbm
// o "1" vai ser o 1+i, e o "n", sera o n-(x-i);
// portanto a mediana será: piso(((1+i)+(n-(x-i))+1)/2)
int opt=((1+i)+(n-(x-i))+1)/2;
int at=v[opt]*(opt-i+1)-(sp[opt]-sp[i])+(sp[n-(x-i)]-sp[opt])-v[opt]*(n-(x-i)-opt);
// o custo eh o modulo de |v[opt]-v[j]|, sendo 1+i<=j<=(n-(x-i))
// temos q se j<=opt => |v[opt]-v[j]|=v[opt]-v[j] (ou seja: qtd*v[opt]-soma de todos menores)
// e caso contrário (j>opt)=>|v[opt]-v[j]|=v[j]-v[opt] (ou seja: soma dos maiores-qtd*v[opt])
cost=min(cost,at);
}
return cost<=lim;
}
int besthub(int R, int L, int X[], int B)
{
n=R;
for(int i=1;i<=n;i++) v[i]=X[i-1];
for(int i=1;i<=n;i++) sp[i]=sp[i-1]+v[i];
int l=1, r=n;
while(l<r){
int mid=(l+r+1)/2;
if(check(mid,B)) l=mid;
else r=mid-1;
}
return l;
}