CF346E-Doodle Jump【类欧】

1|0正题

题目链接:https://www.luogu.com.cn/problem/CF346E


1|1题目大意

给出a,n,p,h,在每个ax%p(x[0,n])的位置有一个关键点,询问是否所有相邻关键点之间的距离都不超过h


1|2解题思路

没怎么写过类欧,这个题还是很坑的,需要考虑求一下h需要的最小值(相邻关键点直接距离的最大值)

首先第一个循环肯定都是ax的位置有关键点了,然后第二个循环开始是paap+ax,然后每个循环的起点加一个paap。好像就可以用类欧把一个大问题缩减成一个小问题了。

考虑一下细节,首先是末尾那一段,也就是apa+1p这一段是没有用的,因为如果这一段无法到达最末尾处,那么一定存在某个k使得ka无法到达(k+1)a

然后考虑有多少个可行的循环,简单的看是anp,但是这样可能会有某些周期没有跑完的情况,那么后面那些间隔是没有变小的,考虑到我们求的是最大间隔,肯定是取后面的,所以此时要减一。

然后当anp的时候就可以取答案了。

时间复杂度O(logn)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll a,n,p,h,T; ll solve(ll a,ll n,ll p){ if(a*n<p)return max(a,p-a*n); ll z=a*n/p; if(a*n%p<p/a*a-a)z--; return solve((p+a-1)/a*a-p,z,a); } signed main() { scanf("%lld",&T); while(T--){ scanf("%lld%lld%lld%lld",&a,&n,&p,&h); a%=p; if(a<=h){puts("YES");continue;} if(a*n<=p){puts(h>=a?"YES":"NO");continue;} puts((solve(a,n,p)<=h)?"YES":"NO"); } return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14315053.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(84)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示