题解 P8092 [USACO22JAN] Drought B
fz20181223 · · 题解
这题可以证明答案的单调性。
很明显,令我们当前使每个奶牛的饥饿值降至
故该题可以通过二分最大饥饿值求解。
由于二分左边界为
值得注意的是我们可能需要一些特判,比如:当奶牛数大于
赛时源代码(有删改):
#include<bits/stdc++.h>
#define mset(a,x) memset(a,x,sizeof(a))
using namespace std;
const int N=1e5+9;
int n,a[N],b[N];
bool check(int x){
memcpy(b,a,sizeof(a));
for(int i=1;i<n;++i){
if(b[i]<x) return 0;
b[i+1]-=(b[i]-x);
}
return b[n]>=x;
}
void solve(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",a+i);
if(n>1&&(a[1]>a[2]||a[n-1]<a[n])){
puts("-1");
return;
}
if(n<3){
puts("0");
return;
}
int l=-1,r=1e9+7;
for(int i=1;i<=n;++i) r=min(r,a[i]);
int tmp=r;
while(l<r){
int mid=(l+r+1)>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
if(l>tmp||l<0){
puts("-1");
return;
}
ll ans=0;
for(int i=1;i<=n;++i) ans+=(a[i]-l);
printf("%lld\n",ans);
}
int main(){
int T;
scanf("%d",&T);
while(T--)solve();
return 0;}