我的想法是让初始两个数辗转相间,到小于K时停手,答案两个数同样。
用集合维护两个辗转相减的结果,两个集合交集非空时满足要求,若都小于K则不合法。
想知道这个想法的正确性,以及时间上该怎么优化……
你搁着问正解呢
#include<bits/stdc++.h>
#define ll long long
#define db double
#define R read()
#define file(a) freopen(#a".in","r",stdin),freopen(#a".out","w",stdout)
using namespace std;
inline ll read() {
ll s=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f*=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
s=s*10+ch-'0';
ch=getchar();
}
return s*f;
}
inline void write(ll x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10),x%=10;
putchar('0'+x);
}//Don't use it for CF.
inline void wk(ll x){write(x);putchar(' ');}
inline void we(ll x){write(x);putchar('\n');}
ll T;
set<ll>l,r;
ll t[5];
signed main(){
T=R;
while(T--){
for(ll i=1;i<=4;i++){
t[i]=R;
}
ll k=R;
bool flag=0;
l.clear(),r.clear();
if(t[1]==t[3]&&t[2]==t[4]){
cout<<"yes"<<endl;
continue;
}
while((!l.count(abs(t[3]-t[4])))&&(!r.count(abs(t[1]-t[2])))){
if(abs(t[3]-t[4])<k&&abs(t[1]-t[2])<k){
flag=1;
break;
}
// for(ll i=1;i<=3;i++)wk(t[i]);
// we(t[4]);
ll x=abs(t[1]-t[2]),y=abs(t[3]-t[4]);
if(x>=k)l.insert(x);
if(y>=k)r.insert(y);
t[1]=t[2],t[2]=x,t[3]=t[4],t[4]=y;
}
if(!flag)cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}