http://hihocoder.com/problemset/problem/1831
比赛的时候根本没想到尺取法。一直在想前缀和和后缀和,陷入怪圈。看到有人说是尺取法后,就马后炮的觉得其实从前缀和后缀和的角度看是很容易想到尺取法的。
总结一下是这样的:
一直觉得需要遍历找起点,用前缀和做优化,所以说出发点就是错的。
尺取法可以把搜索和更新序列二合一。
不用考虑具体是a[i]还是b[i]有问题,因为a[i]-b[i]有问题包含了以上两种情况。
#include<stdio.h>
#define MAX 1000005
int p[MAX<<1],a[MAX],b[MAX];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
long long c;
scanf("%d%lld",&n,&c);
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
}
for(int i = 1;i <= n;i++)
{
scanf("%d",&b[i]);
}
for(int i = 1;i <= n;i++)
{
p[i] = p[i + n] = a[i] - b[i];
}
int l = 1,r = 1;
while(l <= n && r - l + 1 <= n)
{
c = c + p[r];
r ++;
while(c < 0)
{
c = c - p[l];
l ++;
}
}
if(l > n)
printf("-1\n");
else
printf("%d\n",l);
}
}