季风会卷走你对她回忆的一切,一如我的季风40ptsWA(悬关求调))
  • 板块灌水区
  • 楼主Frielen
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/8/6 14:18
  • 上次更新2024/8/6 15:09:57
查看原帖
季风会卷走你对她回忆的一切,一如我的季风40ptsWA(悬关求调))
1125685
Frielen楼主2024/8/6 14:18

季风(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;
}
2024/8/6 14:18
加载中...