CF346E-Doodle Jump【类欧】
正題
題目鏈接:https://www.luogu.com.cn/problem/CF346E
題目大意
給出a,n,p,ha,n,p,ha,n,p,h,在每個ax%p(x∈[0,n])ax\%p(x\in[0,n])ax%p(x∈[0,n])的位置有一個關鍵點,詢問是否所有相鄰關鍵點之間的距離都不超過hhh。
解題思路
沒怎么寫過類歐,這個題還是很坑的,需要考慮求一下hhh需要的最小值(相鄰關鍵點直接距離的最大值)
首先第一個循環肯定都是axaxax的位置有關鍵點了,然后第二個循環開始是?pa?a?p+ax\lceil\frac{p}{a}\rceil a-p+ax?ap??a?p+ax,然后每個循環的起點加一個?pa?a?p\lceil\frac{p}{a}\rceil a-p?ap??a?p。好像就可以用類歐把一個大問題縮減成一個小問題了。
考慮一下細節,首先是末尾那一段,也就是a?pa?+1~pa\lfloor\frac{p}{a}\rfloor+1\sim pa?ap??+1~p這一段是沒有用的,因為如果這一段無法到達最末尾處,那么一定存在某個kkk使得kakaka無法到達(k+1)a(k+1)a(k+1)a。
然后考慮有多少個可行的循環,簡單的看是?anp?\lfloor\frac{an}{p}\rfloor?pan??,但是這樣可能會有某些周期沒有跑完的情況,那么后面那些間隔是沒有變小的,考慮到我們求的是最大間隔,肯定是取后面的,所以此時要減一。
然后當an≤pan\leq pan≤p的時候就可以取答案了。
時間復雜度O(log?n)O(\log n)O(logn)
code
#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; }總結
以上是生活随笔為你收集整理的CF346E-Doodle Jump【类欧】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 盲女第五人格天赋 第五人格盲女天赋加点详
- 下一篇: P4590-[TJOI2018]游园会【