要求的点满足特定性质
对a[i]-b[i]做前缀和s[i]
满足从该点开始往后n个点的最小s不会比起点的s小超过c
只需满足这个条件就付的起钱
#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for (int i=(a);i<=(b);i++)
#define cint const int &
#define inf 100000000000000000LL
#define N 1000005
typedef long long ll;
ll s[N<<1],ans;
int a[N],b[N],tot,rt,L,R,n,c,m;
struct node{ll k;int l,r;}t[N<<2];
void build(int &k,cint l,cint r)
{
if (!k) t[k=++tot]=(node){0,0,0};
if (l==r) {t[k].k=s[l];return;}
int mid=l+r>>1;
build(t[k].l,l,mid);
build(t[k].r,mid+1,r);
t[k].k=min(t[t[k].l].k,t[t[k].r].k);
}
inline void prepare()
{
tot=0;
rt=0;
}
void find(cint k,cint l,cint r)
{
if (L<=l && r<=R)
{
ans=min(ans,t[k].k);
return;
}
int mid=l+r>>1;
if (L<=mid) find(t[k].l,l,mid);
if (mid<R) find(t[k].r,mid+1,r);
}
inline bool check(int st)
{
L=st;
R=st+n-1;
ans=inf;
find(rt,1,m);
return ans+c>=s[st-1];
}
inline void solve()
{
prepare();
scanf("%d%d",&n,&c);
For(i,1,n) scanf("%d",a+i);
For(i,1,n) scanf("%d",b+i);
For(i,1,n) s[i]=s[n+i]=a[i]-b[i];
m=n<<1;
For(i,1,m) s[i]+=s[i-1];
build(rt,1,m);
For(i,1,n) if (check(i)) {printf("%d\n",i);return;}
puts("-1");
}
int main()
{
int T;
scanf("%d",&T);
while (T--) solve();
}