【求助】关于月赛T5正解结论
查看原帖
【求助】关于月赛T5正解结论
93707
Rnfmabj楼主2022/5/16 19:02

又WA又T,味道真是好极了

我的想法是让初始两个数辗转相间,到小于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;
}
2022/5/16 19:02
加载中...