题解: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;
}
本文来自博客园,作者:GE9x,转载请注明原文链接:https://www.cnblogs.com/GE9X/p/19658103

浙公网安备 33010602011771号