题目链接
E. Are You Fired?
题意:给你一个n,前(n+1)/2个数输入给你,后n/2(向下取整) 个数都是x,(-10^9<=x<=10^9),现在要你求一个k,使得数组内所有连续子序列长度为k的和大于0.
参考做法来自:博客
做法:
相当于枚举后缀和(i从1开始)。如果有一种方法可以枚举所有的区间就好了,但是不行,会超时。
枚举左端点,右端点是n。然后左端点右移,前面的所有区间能同时左移取最小值,太麻烦了,直接取前面所有区间最小值右区间左移就行了(这样 就相当于枚举了所有长度为 当前区间长度 并求的最小值了,妙啊)。
#include<bits/stdc++.h>
#define lowbit(i) i&(-i)
using namespace std;
typedef long long ll;
const int N=1e6+6;
const ll inf=1e18;
int n;
ll k;
ll a[N],sum[N];
ll solve(int x){
return sum[k]-sum[x-1];
}
int main(){
scanf("%d",&n);
k=(n+1)/2;
for(int i=1;i<=k;i++){
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
int x;
scanf("%d",&x);
ll minn=inf;
ll ans=-1;
ll half=1ll*n/2;
for(int i=1;i<=k;i++){
ll tmp=solve(i)+half*x;
if(minn==inf)
minn=tmp;
else{
minn-=x;
minn=min(minn,tmp);
}
if(minn>0)
ans=n-i+1;
}
printf("%lld\n",ans);
return 0;
}
/*
8
-10 -9 -8 -7 2 2 2 2
*/