Loading

题解:P10217 [省选联考 2024] 季风

P10207

这个感觉是 Day1T1 中比较简单的。
由于季风是反复的,我们只需要对于周期中的每一个相位,找到第一个满足条件的时刻就可以了。这个可以直接解线性不等式,对每一个象限列一个不等式就行了,还要考虑分母为 \(0\) 的情况 (我真糖,只需要把绝对值拆开,四种情况全满足就行了,可以参考 AT_abc437_f,我都场切了这个没想到何意味)。通过提取每一个相位获得快速计算答案的方式,是这题的核心思想。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+7;
int lodiv(int x,int y){
	if(x%y==0) return x/y;
	if(y<0) x=-x,y=-y;
	if(x>0) return x/y;
	else return x/y-1;
}
int hidiv(int x,int y){
	if(x%y==0) return x/y;
	if(y<0) x=-x,y=-y;
	if(x>0) return x/y+1;
	else return x/y;
}
int n,k,x,y,dx[N],dy[N],a,b,ans;
void solve(){
	cin>>n>>k>>x>>y; ans=1e18; a=b=0;
	for(int i=1;i<=n;i++) cin>>dx[i]>>dy[i];
	for(int i=1;i<=n;i++) a-=dx[i],b-=dy[i];
	for(int i=0,l=0,r=1e18;i<n;i++,x-=dx[i],y-=dy[i],l=0,r=1e18){
		if(a+b-k*n==0){if(k*i-x-y<0) continue;}
		else if(a+b-k*n>=0) r=min(r,lodiv(k*i-x-y,a+b-k*n));
		else l=max(l,hidiv(k*i-x-y,a+b-k*n));
		if(a-b-k*n==0){if(k*i-x+y<0) continue;}
		else if(a-b-k*n>=0) r=min(r,lodiv(k*i-x+y,a-b-k*n));
		else l=max(l,hidiv(k*i-x+y,a-b-k*n));
		if(b-a-k*n==0){if(k*i+x-y<0) continue;}
		else if(b-a-k*n>=0) r=min(r,lodiv(k*i+x-y,b-a-k*n));
		else l=max(l,hidiv(k*i+x-y,b-a-k*n));
		if(-a-b-k*n==0){if(k*i+x+y<0) continue;}
		else if(-a-b-k*n>=0) r=min(r,lodiv(k*i+x+y,-a-b-k*n));
		else l=max(l,hidiv(k*i+x+y,-a-b-k*n));
		if(l>r) continue;
		ans=min(ans,l*n+i);
	}
	if(ans>=1e17) ans=-1; cout<<ans<<"\n";
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t; cin>>t;
	while(t--) solve();
	return 0;
}
posted @ 2026-03-02 12:16  GE9x  阅读(17)  评论(0)    收藏  举报