#include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<ctime>
#include<algorithm>
#define int long long
#define st pair<node,int>
using namespace std;
inline int read(){
int f=1,ans=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
return f*ans;
}
struct node{
int x,y,z;
}s,t;
int ch[4];
void init(){
for(int i=1;i<=3;i++) ch[i]=read();
sort(ch+1,ch+4);
s.x=ch[1],s.y=ch[2],s.z=ch[3];
for(int i=1;i<=3;i++) ch[i]=read();
sort(ch+1,ch+4);
t.x=ch[1],t.y=ch[2],t.z=ch[3];
}
st find(int x,int y,int z){
int deep=0,d1=y-x,d2=z-y;
while(d1!=d2){
d1=y-x,d2=z-y;
if(d1<d2){
int step=d2/d1;
if(d2%d1==0){
x+=(step-1)*d1,y+=(step-1)*d1;
deep+=(step-1);
}else{
x+=step*d1;y+=step*d1;
deep+=step;
}
}else{
int step=d1/d2;
if(d1%d2==0){
y-=(step-1)*d2;z-=(step-1)*d2;
deep+=(step-1);
}else{
y-=step*d2;z-=step*d2;
deep+=step;
}
}
}
node k;k.x=x,k.y=y,k.z=z;
return make_pair(k,deep);
}
node get(int x,int y,int z,int deep){
int d1=y-x,d2=z-y;
while(d1!=d2&&deep!=0){
d1=y-x,d2=z-y;
if(d1<d2){
int step=d2/d1;
if(d2%d1==0){
if(step-1<=deep){
deep-=(step-1);
x+=(step-1)*d1,y+=(step-1)*d1;
}else{
x+=deep*d1;y+=(deep*d1);deep=0;break;
}
}else{
if(step<=deep){
deep-=step;
x+=step*d1,y+=step*d1;
}else{
x+=deep*d1,y+=deep*d1;deep=0;break;
}
}
}else{
int step=d1/d2;
if(d1%d2==0){
if(step-1<=deep){
deep-=(step-1);
y-=(step-1)*d2,z-=(step-1)*d2;
}else{
y-=deep*d2,z-=deep*d2;deep=0;break;
}
}else{
if(step<=deep){
deep-=step;
y-=step*d2,z-=step*d2;
}else{
y-=deep*d2,z-=deep*d2;deep=0;
break;
}
}
}
}
node k;k.x=x,k.y=y,k.z=z;
return k;
}
int ans=0;
bool same(node x1,node x2){return x1.x==x2.x&&x1.y==x2.y&&x1.z==x2.z;}
int l,r,minn=INT_MAX;
void check(){
int tot=0;
while(1){
ch[1]=rand(),ch[2]=rand(),ch[3]=rand();
if(ch[1]==ch[2]||ch[1]==ch[3]||ch[2]==ch[3]){continue;}
sort(ch+1,ch+4);int x=ch[1],y=ch[2],z=ch[3];
st p1=find(x,y,z);
node k=p1.first;
if(same(k,get(x,y,z,p1.second))){printf("AC %d\n",++tot);}
else{
printf("WA");exit(0);
}
}
}
signed main(){
init();
st p1=find(s.x,s.y,s.z);node k1=p1.first;int deep1=p1.second;
st p2=find(t.x,t.y,t.z);node k2=p2.first;int deep2=p2.second;
if(!same(k1,k2)){printf("NO\n");return 0;}
printf("YES\n");
if(deep1<deep2){ans+=deep2-deep1;node k=get(t.x,t.y,t.z,deep2-deep1);t.x=k.x,t.y=k.y,t.z=k.z;}
else if(deep1>deep2){ans+=deep1-deep2;node k=get(s.x,s.y,s.z,deep1-deep2);s.x=k.x,s.y=k.y,s.z=k.z;}
l=0,r=(deep1+deep2)<<1;
while(l<=r){
int mid=l+r>>1;
if(same(get(s.x,s.y,s.z,mid),get(t.x,t.y,t.z,mid))){r=mid-1;minn=min(minn,mid);}
else l=mid+1;
}printf("%d\n",2*minn+ans);
}
1699: 跳跳棋
最新推荐文章于 2024-04-15 08:18:05 发布