BZOJ 2144 跳跳棋 二分 LCA

2021-08-08 22:51:43 字數 890 閱讀 8858

description

跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲:棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。(棋子是沒有區別的)跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳動後兩顆棋子距離不變。一次只允許跳過1顆棋子。 寫乙個程式,首先判斷是否可以完成任務。如果可以,輸出最少需要的跳動次數。

這題好神啊!首先我們要把問題轉化一下:對於乙個狀態(x,y,z),假設x< y< z,那麼若y-x!=z-y,有三種跳法:中間向左邊或右邊跳,左邊或右邊向中間跳,然後我們可以把中間向兩邊跳的作為這種狀態的兒子,向中間跳的看做是父親,那麼問題就轉化為樹上兩點之間的距離。然後,然後我就不知道怎麼說了……lych_cys

#include

using

namespace

std;

#define ll long long

const

int inf=1000000000;

int read()

while(ch>='0'&&ch<='9')

return x*f;

}struct nodea,b;

bool same(node a,node b)

int step,len1,len2;

node get(node t,int tot)

else

}return t;

}int main()

puts("yes");

if(len1int l=0,r=len2;

while(l<=r)

printf("%d",(r+1)*2+len1-len2);

}

BZOJ2144 國家集訓隊 跳跳棋

跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳動後兩顆棋子距離不變。一...

bzoj2144 國家集訓隊2011 跳跳棋

跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳動後兩顆棋子距離不變。一...

跳跳棋 LCA 二分

description 跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳...