P10217 [省选联考 2024] 季风
P10217 [省选联考 2024] 季风
[省选联考 2024] 季风
题目背景
生活在二维平面的小 X 准备拜访小 Y,但由于气候的变化,平面上刮起了季风。小 X 想知道季风的影响下,TA 至少要多少天能够到达小 Y 的家,但小 X 也是第一次遇见这种怪事,所以请精通算法的你来帮忙。
题目描述
给定
找到最小的非负整数
; ; 。
特别地,
输入格式
本题有多组测试数据。输入的第一行一个整数
对于每组测试数据,
- 第一行四个整数
; - 接下来
行,第 行两个整数 。
输出格式
对于每组测试数据输出一行一个整数,如果存在满足题意的
欢乐补题捏
首先我们来整理一下式子:
我们将n无限循环,则原式可化为:
|
|
把绝对值拆了之后:
求出同时满足这四个条件的m
记
考虑枚举每个1<=i<=n:
记
则
特殊的,当sum=时,若
同理,对上面提到过的四种情况做相同的讨论,得出
最后统计答案时,若满足
则
然后这题就做完了
Code
#include<bits/stdc++.h> #define int long long const int N=1e6+5; const int inf=1e18; using namespace std; int x[N],y[N],s[N],l[N],r[N]; int n,k,X,Y; void calc(int fx,int fy) { int pos=fx*X+fy*Y; for(int i=1;i<=n;i++) { s[i]=s[i-1]+x[i]*fx+y[i]*fy+k; } if(!s[n]) { for(int i=1;i<=n;i++) { if(s[i]<pos)r[i]=-1; } return ; } else { for(int i=1,fz,fm=s[n];i<=n;i++) { fz=pos-s[i]; if(s[n]>0) { if(fz>0)//ans_l=(pos-s[i])/s[n] (bigger) { l[i]=max(l[i],(fz%fm? fz/fm+1 : fz/fm)); } } else //ans_r=(pos-s[i])/s[n] (lower) { if(fz>0)//ans_r<0 { r[i]=-1ll; } else { r[i]=min(r[i],fz/fm); } } } } } void work() { cin>>n>>k>>X>>Y; for(int i=1;i<=n;i++) { scanf("%lld%lld",&x[i],&y[i]); l[i]=0; r[i]=inf; } if(!X&&!Y) { printf("%lld\n", 0ll); return; } int ans=inf; calc(1,1);calc(1,-1);calc(-1,1);calc(-1,-1); for(int i=1;i<=n;i++) { if(l[i]<=r[i]) ans=min(ans,l[i]*n+i); } printf("%lld\n",ans==inf? -1ll : ans); } #undef int int main() { //freopen("P10217_1.in","r",stdin);//freopen("P10217.out","w",stdout); int T; cin>>T; while(T--) { work(); } }