bzoj2144 國家集訓隊2011 跳跳棋

2022-05-02 06:54:10 字數 1087 閱讀 7670

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

寫乙個程式,首先判斷是否可以完成任務。如果可以,輸出最少需要的跳動次數。

第一行包含三個整數,表示當前棋子的位置a b c。(互不相同)第二行包含三個整數,表示目標位置x y z。(互不相同)

如果無解,輸出一行no。如果可以到達,第一行輸出yes,第二行輸出最少步數。

1 2 3

0 3 5

yes2

【範圍】

100% 絕對值不超過10^9

正解:倍增lca

為了方便研究跳法,我們把棋子按座標大小排序。我們發現,當中間那粒棋子與左邊的距離和與右邊的距離不相等時,有3種跳法,而兩者距離相等時,只有兩種跳法。所以,對於往中間跳的跳法,我們可以把它理解成在樹上跳父親,而對於往旁邊跳,我們可以理解成在樹上跳兒子。所以我們就可以把題意轉化一下,即第一問為兩種狀態是否有lca,而第二種則是問兩種狀態在樹上的距離。我們可以採用類似倍增的方法跳lca,來求出答案。

//it is made by wfj_2048~

#include #include #include #include #include #include #include #include #include #include #include #define inf 1<<30

#define il inline

#define rg register

#define ll long long

using namespace std;

struct data

};int a[2][5],depa,depb;

il int gi()

il data find(rg data u,rg int k,rg int &dep)

printf("%d\n",ans+2*ans); return;

}int main()

BZOJ2144 國家集訓隊 跳跳棋

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

國家集訓隊 旅遊

題目背景 ray 樂忠於旅遊,這次他來到了 t 城。t 城是乙個水上城市,一共有 nn 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有 n 1n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心...

國家集訓隊 Tree I

題目 給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有nee dneed need 條白色邊的生成樹。題目保證有解。思路 凸優化裸題,要注意的就是,優先選白色 優先選黑色也行 主要是同一斜率可能會切到很多點,那麼就要有乙個標準,要麼選最小點,要麼選最大。另外求出來的點不一定是ne...