跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲:棋盤上有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...