季风(P10217)WA后6个点,求调
#include<bits/stdc++.h>
using namespace std;
#define int long long
int T,n,k,X,Y,ans,x[1000009],y[1000009],l[1000009],r[1000009]/*-114 means no solution*/,f[1000009];
void Solve(int check1,int check2){
int protect=check1*X+check2*Y;
for(int i=1;i<=n;i++)
f[i]=f[i-1]+check1*x[i]+check2*y[i]+k;
if(!f[n]){
for(int i=1;i<=n;i++)
if(f[i]<protect)
r[i]=-114/*No solution*/;
return;
}
for(int i=1;i<=n;i++){
if(f[i]>0){
if(f[i]<protect){
if(!((protect-f[i])%f[n])) l[i]=max(l[i],(protect-f[i])/f[n]);
else l[i]=max(l[i],(protect-f[i])/f[n]+1);
}
}
else{
if(f[i]>=protect) r[i]=min(r[i],(protect-f[i])/f[n]);
else r[i]=-1;
}
}
}
signed main(){
// freopen("wind.in","r",stdin);
// freopen("wind.out","w",stdout);
cin>>T;
while(T--){
cin>>n>>k>>X>>Y;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
l[i]=0,r[i]=1e15;
}
if(!X&&!Y){
cout<<"0\n";
continue;
}
Solve(1,1);
Solve(1,-1);
Solve(-1,1);
Solve(-1,-1);
ans=9e18+9;
for(int i=1;i<=n;i++)
if(l[i]<=r[i]/*Have solution*/)
ans=min(ans,n*l[i]+i);
if(ans==9e18+9)
cout<<"-1\n";
else
cout<<ans<<"\n";
}
return 0;
}