E. Water Level:
题意:
题意:初始水量为k,每天你可以使水量加y,然后每天必定消耗x的水,水量要始终在范围[L,R]中,问你能不能坚持t天
题目分析:
当x>=y时,我们每次可以减少x或者x-y,为了晚点到l,我们就减少y-x,所以我们只要看第一天能不能加y就可以。
当x<y时,我们可以先减到不能减,在加上y,因为x<=1e6,所以我们减去若干个x后余数一定在0~x-1,所以我们可以看余数是否出现过,如果出现,说明我们可以一直执行这个循环来使t为0,如果我们发现水量既不可以减去x,也不能加上y,说明不成立。
代码:
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#pragma GCC optimize(3)
using namespace std;
int k,l,r,t,x,y;
map<int,int> mp;
void solve(){
cin>>k>>l>>r>>t>>x>>y;
if(x>=y){
__int128 tmp=1;
if(k+y>r)
tmp=tmp*k-tmp*t*x+tmp*(t-1)*y;
else
tmp=tmp*k-tmp*(x-y)*t;
if(tmp>=l)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
else{
int res=(k-l)%x;
t-=(k-l)/x;
mp[res]=1;
bool flag=0;
while(t>0){
if(l+y+res>r){
flag=1;
break;
}
t-=(y+res)/x;
res=(y+res)%x;
if(mp[res])break;
mp[res]=1;
}
if(!flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
solve();
return 0;
}