[省选联考 2024] 季风 题解
首先整理式子,把
; 。
看到
。
但是这个式子显然是不能囊括所有情况的。
例如,当
思考我们关注的是什么,距离。坐标可正可负,但是走到目标所需的距离一定是非负整数。
于是我们给上式加上绝对值,变成凑距离的形式。同时,我们贪心地想,对于每个
。
但是单这样还不够,
考虑到一个
。
接下来就是恶心的分讨了。
不妨设
对
-
,此时 的增长给 带来了负收益。 -
,此时 的增长给 带来了正收益。
两个函数均呈先单调减后单调增的趋势(由于
我们需要实现一个函数 check(l,r,p,xd,yd)
能够求出在
根据函数传入的参数,我们可以知道当
我们设
最后判断
时间复杂度:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 LL;
const ll maxn=1000007,ee=1000000000000000007ll;
ll n,k,xg,yg,X[maxn],Y[maxn],sx[maxn],sy[maxn],val[maxn],ans;
LL myabs(LL x){return (x>0?x:-x);}
ll checkseg(ll l,ll r,ll p,ll xd,ll yd){
if(l>r) return ee;
LL sum=((LL)l*n+p+1)*(LL)k,bas=myabs(xg-sx[p+1]-(LL)l*sx[n])+myabs(yg-sy[p+1]-(LL)l*sy[n]),delt=xd*sx[n]+yd*sy[n];
if(bas<=sum) return l*n+p+1; if(delt>=(LL)n*k) return ee;
LL res=(bas-sum+(LL)n*(LL)k-delt-1)/((LL)n*(LL)k-delt); if(l+res>r) return ee; return (l+res)*n+p+1;
}
void solve(void){
for(ll i=0,xz,yz,xt,yt;i<n;i++){
if(val[i+1]!=ee) continue; xz=-1,yz=-1;
if(sx[n]) xz=max((xg-sx[i+1])/sx[n],0ll); if(sy[n]) yz=max((yg-sy[i+1])/sy[n],0ll);
if(xz>yz){
val[i+1]=checkseg(0,yz,i,(sx[n]>0?-1:1),(sy[n]>0?-1:1)); if(val[i+1]!=ee) continue;
val[i+1]=checkseg(yz+1,xz,i,(sx[n]>0?-1:1),(sy[n]>0?1:-1)); if(val[i+1]!=ee) continue;
val[i+1]=checkseg(xz+1,ee,i,(sx[n]>0?1:-1),(sy[n]>0?1:-1));
}else{
val[i+1]=checkseg(0,xz,i,(sx[n]>0?-1:1),(sy[n]>0?-1:1)); if(val[i+1]!=ee) continue;
val[i+1]=checkseg(xz+1,yz,i,(sx[n]>0?1:-1),(sy[n]>0?-1:1)); if(val[i+1]!=ee) continue;
val[i+1]=checkseg(yz+1,ee,i,(sx[n]>0?1:-1),(sy[n]>0?1:-1));
}
}
}
int main(void){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
ll Tccs=1;
cin>>Tccs;
for(ll tcs=1;tcs<=Tccs;tcs++){
cin>>n>>k>>xg>>yg; ans=ee;
for(int i=1;i<=n;i++) cin>>X[i]>>Y[i],sx[i]=sx[i-1]+X[i],sy[i]=sy[i-1]+Y[i],val[i]=ee;
if(xg==0&&yg==0){cout<<"0\n"; continue;}
else solve();
for(int i=1;i<=n;i++) ans=min(ans,val[i]);
cout<<(ans>=ee?-1:ans)<<"\n";
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现