P1852-跳跳棋【思维,差分,二分】

P1852-跳跳棋【思维,差分,二分】正题题目链接:https://www.luogu.com.cn/problem/P1852题目大意一个数轴上有$3$个跳棋,你每次可以将一个跳棋跳到另一个跳棋对称的位置,但是不能一次跨过两个棋子。给出初始状态,和目标状态,求最小步数。坐标的绝对值不超过$10^9$解题思路首先排序+差分一

大家好,欢迎来到IT知识分享网。P1852-跳跳棋【思维,差分,二分】"

正题

题目链接:https://www.luogu.com.cn/problem/P1852


题目大意

一个数轴上有\(3\)个跳棋,你每次可以将一个跳棋跳到另一个跳棋对称的位置,但是不能一次跨过两个棋子。给出初始状态,和目标状态,求最小步数。

坐标的绝对值不超过\(10^9\)


解题思路

首先排序+差分一下记为\(a,b,c\),然后四种跳法操作模拟一下发现是

  1. \((a,b,c)\rightarrow (a,b+c,c)\)
  2. \((a,b,c)\rightarrow (a,b-c,c)\)
  3. \((a,b,c)\rightarrow (a+b,b,c-b)\)
  4. \((a,b,c)\rightarrow (a-b,b,c+b)\)

然后下一步就不会了

反着考虑,能发现这些操作都是可逆的,也就是说我们可以从终点开始倒着推,或者我们可以正反着一起推,并且只保留两个操作

  • \((a,b,c)\rightarrow (a,b-c,c)\)
  • \((a,b,c)\rightarrow (a+b,b,c-b)\)

然后此时不难发现对于一个\(a,b,c\)最多只能执行以上的一个操作。

这个可以视为一个往根跳的过程,然后求两个点的路径长度,而跳的过程可以类似于\(gcd\)的复杂度做,因为\(b+c\)是一直减少的,以\(b+c\)代深度然后二分\(LCA\)的深度即可。

时间复杂度:\(O(\log^2 D)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll a,b,c,A,B,C;
ll jump(ll &a,ll &b,ll &c,ll x){
	ll ans=0;
	while(b+c>x){
		if(b==c)return ans;
		if(b>c){
			ll k=min((b-1)/c,(b+c-x+c-1)/c);
			ans+=k,b-=k*c;
		}
		else{
			ll k=min((c-1)/b,(b+c-x+b-1)/b);
			ans+=k,a+=k*b,c-=k*b;
		}
	}
	return ans;
}
bool check(ll w){
	ll x=a,y=b,z=c,X=A,Y=B,Z=C;
	jump(x,y,z,w);
	jump(X,Y,Z,w);
	return (X==x)&&(Y==y)&&(Z==z);
}
void cp(ll &x,ll &y)
{if(x>y)swap(x,y);return;}
signed main()
{
	scanf("%lld%lld%lld",&a,&b,&c);
	cp(b,c);cp(a,b);cp(b,c);c=c-b;b=b-a;
	scanf("%lld%lld%lld",&A,&B,&C);
	cp(B,C);cp(A,B);cp(B,C);C=C-B;B=B-A;
	ll x=a,y=b,z=c,X=A,Y=B,Z=C;
	jump(x,y,z,0);
	jump(X,Y,Z,0);
	if(x!=X||y!=Y||z!=Z)return puts("NO")&0;
	ll l=0,r=min(b+c,B+C);
	while(l<=r){
		ll mid=(l+r)>>1;
		if(check(mid))l=mid+1;
		else r=mid-1;
	}
	x=a,y=b,z=c,X=A,Y=B,Z=C;
	printf("YES\n%lld\n",jump(x,y,z,r)+jump(X,Y,Z,r));
	return 0;
}

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/34678.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信