bzoj 2144 二分 lca 神題詳解

2021-07-27 23:09:20 字數 3355 閱讀 4858

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

一眼看上去多像usaco的抓住那只牛,然而這道題bfs只可以得20分...(我是蒟蒻我驕傲...= =)

好吧,我們來說正經的題解

對於局勢(a,b,c),我們保證a

(1)中間的b可以隨意向兩邊跳 即 b跳到左邊 ->(2a-b,a,c)或 b跳到右邊 -> (a,c,2c-b)

(2)對於兩邊的a和c向中間跳,

①b-a = c-b a和c都不可跳

②b-a > c-b c可以往中間跳  -> (a,2b-c,b) 

③b-a < c-b a可以往中間跳 ->  (b,2b-a,c)

顯然,對於每種局勢(a,b,c)都對應兩種向兩邊跳的局勢,而最多有一種向中間跳的;同時,相對於向兩邊跳的,原局勢即為它們往中間跳的唯一對應的局勢

所以,我們令 往中間跳可以到達的局勢(a',b',c')為原局勢(a,b,c)的父親節點,向兩邊跳能到達的兩種情況(a1,b1,c1)和 (a2,b2,c2)為 原局勢(a,b,c)的子節點

那麼,對於我們已知的局勢(a,b,c),必然會形成一棵樹,樹上節點所代表的局勢可互相到達

(其實這種思想和彈飛綿羊那道題很像)

如果我們的初始局勢和最終局勢不在同一棵樹上,則必然不能完成轉移,否則則可以到達

對於可以到達的情況,我們需要求出它最少的跳動次數

即求同一棵樹上的兩個節點間的距離,顯然是lca,即求出各自到lca的距離累加即可,一般用lca或二分距離+判斷即可

接下來我們需要解決的就是如何在已知次數的情況下找到它所到達的局勢或者在已知局勢的情況的下找到轉移的次數

顯然後者就是我們題目所求,如果早就能解決它我們還在這裡說這麼一大堆做啥...

所以我們集中精力去解決第乙個問題      「如何在已知次數的情況下找到它所到達的局勢 」

由於我們是求到lca的距離,所以我們只需要解決往中間跳即可

令 t1=b-a , t2=c-b 

那麼我們就可以用(t1,t2)來表示 局勢(a,b,c)(所有的'/'表示下取整)

對於上面討論的兩邊的a和c向中間跳的情況:

①t1=t2 a和c都不可跳,即當前局勢為根節點

②t1>t2 c可以往中間跳 -> (t1-t2,t2),

且最多跳 (t1-1)/t2 次直到c不能跳 -> (t1 % t2,t2) ,即(a,b - (t1-1)/t2 * t2,c - (t1-1)/t2 * t2)

此時 (t1,t2)到(t1 % t2,t2)的深度(距離)為 (t1-1)/ t2

③t1(t1,t2-t1),

且最多跳 (t2-1)/t1 次直到a不能跳 ->(t1,t2 % t1), 即(a + (t2-1)/t1 *t1,b + (t2-1)/t1 * t1,c)

此時  (t1,t2)到(t1,t2 % t1)的深度(距離)為 (t2-1)/ t1

類似碾轉相除法的處理,我們可以在已知次數k的情況下,o(longk)找到所到達的局勢

所以,對於上面所求同一棵樹上兩點間的距離,我們先把他們跳到同一深度,然後再二分到lca的距離,判斷所到達局勢是否相等即可

最終答案=abs(d2-d1)+ tt*2 

(d1、d2分別代表初始局勢和最終局勢到根的深度,tt表示二者跳到同一高度後到lca的距離)

注意:資料保證絕對值不超多10^9,所以一開始找初始局勢和自重局勢各自的根節點時,步數為10^9,mdzz一直少打個0,查了乙個小時的錯

BZOJ 2144 跳跳棋 二分 LCA

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

模擬題 二分 動態規劃 神光

題目描述 亮亮成功地唸出了咒語,石門緩緩地自動移開,一道道絢麗的神光從城堡內激射而出。亮亮好奇而又興奮地走入了城堡中,迎面有一座極長的魔法陣。魔法陣可以看作一條直線,它被均勻地分成了1000000000 1 000 000 000 100000 0000 個位置,乙個位置可以看成是乙個格仔。有些位置...

跳跳棋 LCA 二分

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