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


    正题

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


    题目大意

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

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


    解题思路

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

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

    然后下一步就不会了

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

    • ((a,b,c) ightarrow (a,b-c,c))
    • ((a,b,c) ightarrow (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
    %lld
    ",jump(x,y,z,r)+jump(X,Y,Z,r));
    	return 0;
    }
    
  • 相关阅读:
    C++类模板的三种特化
    构造函数抛异常
    ScrapySharp
    QtWebKit
    visual studio 插件
    asp.net 开源
    cfr
    eclipse icon
    JAD Java Decompiler
    Java Decompiler
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/15406557.html
Copyright © 2020-2023  润新知