前言
本题运用二分法与前缀和解决
思路:用二分法在k取值范围找到满足条件和不满足条件k的边界
二分模板
bool check(int x) // 检查x是否满足某种性质
{
/* ... */
}
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
// check()判断mid是否满足性质
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
前缀和模板
st[i] = a[i] + st[i-1];
题目详情
解题代码
#include<iostream>
using namespace std;
typedef long long LL;
const int N=1e6+5;
int n;
int a[N];
LL s,st[N];
bool check(int k)
{
for(int i=k;i<=n-k;i++)
{
if((st[i]-st[i-k])<=s &&(st[i+k]-st[i])<=s) return true;
}
return false;
}
int main()
{
scanf("%d %lld",&n,&s);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
st[i] = a[i] + st[i-1];
}
int l=0,r=1e6;
while(l<r)
{
int mid=l+r+1 >> 1;
if(check(mid)) l=mid;
else r=mid-1;
}
printf("%d",2*l);
return 0;
}