传送门
首先让
k
−
=
l
,
r
−
=
l
k-=l,r-=l
k−=l,r−=l,方便后续讨论。
然后分三种情况。
一、若 y = x y=x y=x,当 k − x ≥ 0 o r k + y ≤ r k-x\ge 0 \;or\; k+y\le r k−x≥0ork+y≤r,那么输出 Y e s Yes Yes,否则输出 N o No No.
二、若 y < x y<x y<x,那么必定是能加水就立刻加水更优,不过考虑到第一天不一定能加水,所以这里还要分两种小情况:
- 若 k + y ≤ r k+y\le r k+y≤r,每天一开始加 y y y升水,然后被同事消耗 x x x升水,总共消耗的水为 d = x − y d=x-y d=x−y, k k k升水最多消耗 t t = ⌊ k d ⌋ tt=\lfloor \frac kd\rfloor tt=⌊dk⌋天,若满足 t t ≥ t tt\ge t tt≥t输出 Y e s Yes Yes,否则输出 N o No No即可。
- 若 k + y > r k+y>r k+y>r,第一天没法加水,故一来就会消耗 k − x k-x k−x升水,后面的情况跟1一样,每天消耗 d = x − y d=x-y d=x−y升水,故其实 k k k升水最多消耗 t t = 1 + ⌊ k − x d ⌋ tt=1+\lfloor \frac{k-x}d\rfloor tt=1+⌊dk−x⌋天,若 t t ≥ t tt\ge t tt≥t输出 Y e s Yes Yes,否则输出 N o No No.
三、若 y > x y>x y>x,那么考虑贪心,先让同事每天喝水,直到恰好不能再消耗 x x x升水为止(继续消耗 k k k会变成负数),这时候再加 y y y升水,然后继续等同事喝水,直到恰好不能再消耗 x x x升水为止…考虑在这个过程中,假设每次将要加(还没加) y y y升水之前的 k k k升水在之前已经出现过了,那么直接输出 Y e s Yes Yes,因为这跟之前形成了一个封闭的循环,代表可以无限循环下去。否则的话水会一直涨,直到超过 r r r,我们记录在超过 r r r之前过去了多少天,这也是能够消耗的最长时间,如果这个时间是不小于 t t t的,那么输出 Y e s Yes Yes,否则输出 N o No No.
bool vis[maxn];
int main(){
ll k=rd(),l=rd(),r=rd(),t=rd(),x=rd(),y=rd();
k-=l;r-=l;
if(y<=x){
ll d=x-y;
if(!d){
if(k+y<=r || k-x>=0)wrsn("Yes");else wrsn("No");
}else{
ll tt=k/d;
if(k+y<=r && tt>=t && k-t*d>=0)wrsn("Yes");else if(k-x>=0){
tt=(k-x)/d;
if(tt+1>=t && k-x-(t-1)*d>=0)wrsn("Yes");else wrsn("No");
}else wrsn("No");
}
}else{
ll cnt=0;
while(true){
cnt+=k/x;
k%=x;
if(vis[k])return wrsn("Yes"),0;
vis[k]=1;
k+=y;
if(k>r)break;
}
if(cnt>=t)wrsn("Yes");else wrsn("No");
}
}