仔細觀察以後可以發現,關於電燈有以下幾個性質:
1根節點不是1,也就是每個點都可能為根節點,這就意味著不能用o(n^2)的做法,只能考慮o(nlogn)或者o(n)
2所有點亮的燈都是連在一起的
3對於乙個已經點亮的點,它的左右子樹只有3種可能:沒有染色,已經全部染完,正在染色
4當你準備將乙個點染色的時候,上乙個染色的點可能是它的父親或者它父親擁有的另外一棵子樹的葉子節點
根據這幾個性質,可以想到dp狀態:
dp[i][j][0]表示將第i個點的子樹全部點亮並且上去點亮i的第j個祖先所需的最小費用
dp[i][j][1]表示將第i個點的子樹全部點亮並且上去點亮i的第j個祖先的另外乙個兒子的最小費用
狀態轉移分三種情況:沒有兒子,乙個兒子,兩個兒子
將dp求出來以後,我們就要算結果了
先列舉每乙個點,將這個點看作根節點,然後一層一層往上跳,計算結果,記錄最小值。
#include
#include
#include
#include
#include
using
namespace std;
template
<
typename t>
inline
void
read
(t &x)
typedef
long
long ll;
const
int n =
2e5+
6, m =23;
int n, log[n]
; ll f[n]
[m][2]
, d[n]
[m], val[n]
;inline
void
prepare()
inline
voiddp(
)elseif(
(i <<1|
1)> n)
else
} ll ans =
0x3f3f3f3f3f3f3f3f
;for
(int i =
1; i <= n; i++
) ans =
min(ans, tmp);}
cout << ans << endl;
}int
main()
loj 2009 SCOI2015 小凸玩密室
loj 2009.scoi2015 小凸玩密室 樹高不會很高 20 點亮燈泡x,點亮x的乙個子樹,再點亮x另外的子樹,然後回到x的父節點,點亮父節點之後再點亮父節點的其他子樹 所以對於乙個節點x,有這樣兩種情況 x還沒有被點亮,那麼下乙個被點亮的是x的乙個兒子 x是葉子節點,那麼下乙個被點亮的是它的...
loj2007 SCOI2015 國旗計畫
一道很有意思的貪心 倍增的題目。首先我們要把環變成鏈 複製一倍放到末尾去 這道題有乙個非常巧妙的性質 任意乙個區間都沒有別的被包含 假如這一道題有包含的話就要把被包含的那個區間給去掉 也就是說把把每乙個士兵的區間左端點從小到大排序後,右端點也是從小到大排好序的。然後我們從貪心的角度思考,對於乙個士兵...
SCOI2009 迷路 題解
恢復內容開始 題目描述 windy 在有向圖中迷路了。該有向圖有 nnn 個節點,windy 從節點 000 出發,他必須恰好在 ttt 時刻到達節點 n 1n 1n 1。現在給出該有向圖,你能告訴 windy 總共有多少種不同的路徑嗎?注意 windy 不能在某個節點逗留,且通過某有向邊的時間嚴格...