首先說一句,樹的每個元素的名稱的問題,(那個叫jie點的東西)
具體是節點還是結點...baidu百科寫的是結點...
本文章將不考慮到底這倆字怎麼寫...所以兩種都可能出現
t2描述:
扶蘇翻遍了歌單卻沒有找到一首歌能做這個題的題目背景,於是放上了扶蘇最喜歡的一首《不老夢》.
與day1的第二題一樣,今天的第二題依然是一道樹論題.
我們定義一棵\(n\)個節點的樹為乙個有\(n\)個節點和\(n-1\)條邊的無向連通圖.
如果我們定義\(u\)是一顆樹\(t\)的根,那麼任意乙個節點\(v\)到根的路徑就是從\(v\)出發到達點\(u\)的簡單路徑上所經過的點的點集。可以證明這樣的簡單路徑有且僅有一條
定義乙個節點\(x\)是節點\(y\)的孩子,當且僅當\(x\)和\(y\)之間有邊相連且\(x\)不在\(y\)到根的路徑中。如果\(x\)是\(y\)的孩子,那麼定義\(y\)是\(x\)的家長節點.
如果我是_rqy那種毒瘤神仙的話,可能會問你每個節點的孩子數不超過\(k\)的\(n\)個節點的帶標號無根樹一共有多少個,可惜這個問題我也不會,所以我不會問你這麼毒瘤的問題.
扶蘇從一顆\(n\)個節點的樹的1號節點出發,沿著樹上的邊行走。當然我們約定1號節點是這棵樹的根。他所行走的規定是:當扶蘇在點 \(u\)時,扶蘇要麼在\(u\)的孩子中選擇乙個沒有到達過得點\(v\)並行走到\(v\),要麼選擇回到\(u\)的家長節點.
現在給每個節點乙個權值\(w\),其中i 號節點的權值為\(w_i\)。扶蘇有一些石子,他想給這棵樹上的某乙個節點放上石子。我們規定扶蘇能在節點\(u\)放上石子當且僅當滿足如下條件:
1、扶蘇當前在節點\(u\)
2、對於\(u\)的所有孩子節點\(v\),節點\(v\)被放上了\(w_v\) 顆石子。
但是,扶蘇在任意時刻都可以取回任意節點的石子。
現在,扶蘇想問問你對於每個節點,如果他想在i 號節點上放\(w_i\)顆石子,那麼他一開始需要準備多少石子.
有人說t3比t2簡單,然而我在考場上對於t2更有思路...
今天大佬在講題時跟我的思路大致一致(woc大致一致!!!!)
分析思路:
由題可知,要拿到整體最優需要考慮前面的石子如何才能充分利用
我們知道前面節點的石子能夠利用的條件是當前處理子節點的幾個兒子節點已滿並且孫子節點非空,再且就是當其同輩節點已經填上石子的情況下,將其孩子節點進行"剝削",將其石子取走,
現在難免要面對這麼乙個問題:
在處理某乙個節點(就是同輩節點)的最小花費時,如何安排順序才能致使結果最優呢?
現在考慮一層有\(n\)個節點,其中該層節點本身需要的石子數先不考慮,只考慮其
因為現在我們考慮每個節點處理的順序的原因是要考慮對其子節點所含石子的利用,
就是要考慮哪個節點的子節點所含石子在填滿(滿足填該節點本身)並且該節點已經填了石子時,其子節點的石子可以拿出來用,
那麼如果當前節點的子節點石子較多,在把此節點的石子填上以後,可重複利用的石子也較多
舉個栗子啦....
如圖:
現在假如4 5節點需要8個石子,6 7節點需要90個石子,2節點需要2個石子,3節點需要10個石子,
分兩種情況討論:
1.先填2節點(意味著先填滿4 5節點)
那麼先取8+2個石子填滿2,4,5節點,現在可以拿出2號節點的子節點中所有石子(當然2節點不能取)來填3號及其子節點,那麼取下面的8個石子,現在右邊需要的總共100個石子中填了8個,還需另外92個石子,只能再次造成花費,新增石子,此時顯然造成了極大浪費,需要使用108個石子.
2.先填3節點
先取100個石子填3號及其子節點,辣麼那麼現在的花費是100,再同樣將3號的子節點石子取出利用,填2號等,此時我們發現這90個剩餘石子不僅能夠完成填滿2號及其子節點的任務,還能去填1號節點或是2,3號的兄弟節點,(僅在這棵確定的二叉樹下)對於填滿2,3所在層,僅需石子100枚(怎麼量詞突然正經?)
通過以上案例模擬易知,也可推知,在處理某層節點時,需要先處理子節點所含石子多的,
(當時考慮暴搜來著,實際就是暴搜,然而並不會處理變數關係...)
再同樣的復讀一遍給出公式推導與證明:
設本層有兩個節點\(i\)與\(j\),設其子節點所含石子總數為\(a_i\)與\(a_j\),
其本身的花費為\(w_i\)與\(w_j\),現在令\(a_i>a_j\)
則有:先買\(i\)的花費是\(max(w_i+a_i,w_i+w_j+a_j)\)
同理先買\(j\)的花費是\(max(w_j+a_j,w_j+w_i+a_i)\)
化簡得這樣兩個式子:
\(w_i+max(a_i,w_j+a_j)\)
\(w_j+max(a_j,w_i+a_i)\)
展開式子:
1式有兩種情況:
\(w_i+a_i\)或\(w_i+w_j+a_j\)
然而第二個鐵定只有一種:
\(w_j+a_i+w_i\), 因為\(a_i\)始終大於\(a_j\)
作差一減便知,無論如何二式減一式總大於等於零,
所以無論如何選\(a_\)總是最優方案,擴充套件一下會發現這是無論樹高的統一結論,
現在剩下所要做的就是搜尋!!
現在需要注意幾點:
1.考慮的處理順序序列其實是不上公升序列而非遞減序列,因為可以有相等的情況出現...
2.在進行深蒐時,如果乙個個跑一邊就顯得太蠢了,不如在每次遞迴處理子節點時將節點按此規則排序,這也是一種優化的方案, 不然會丟30分(乙個點30分)
沒親測,但有效~
**貼上(又是好神奇的二空格首行縮排,這就是強者的世界嘛?):
#include #include #include const int maxn = 100010;
int n;
int mu[maxn], ans[maxn];
std::vectorson[maxn];
void dfs(const int u);
bool cmp(const int &_a, const int &_b);
int main()
for (int i = 1; i <= n; ++i)
dfs(1);
for (int i = 1; i < n; ++i)
printf("%d\n", ans[n]);
return 0;
}void dfs(const int u)
std::sort(son[u].begin(), son[u].end(), cmp);
int _ret = 0;
for (auto v : son[u]) else
} ans[u] += std::max(0, mu[u] - _ret);
}inline bool cmp(const int &_a, const int &_b)
SIP協議中的T1和T2
sip協議中的t1和t2 因為sip定義了自己的可靠性機制,所以可以使用不可靠的傳輸層協議,比方說udp,來進行連線。使用udp來傳輸sip時,訊息的丟失和接受訊息的順序錯亂都是有可能的。因為udp只能保證傳輸的內容是無錯的,但是不能保證傳輸的內容一定會到達目的地。sip的可靠性機制包括 1.重傳計...
判斷樹T2是否為T1的子樹
你有兩顆非常大的二叉樹 t1,有幾百萬個節點 t2有幾百個節點。設計乙個演算法,判斷t2是否為t1的子樹。如果t1有乙個節點n,其子樹與t2一模一樣,則t2為t1的子樹。也就是說,從節點n 處把樹砍斷,得到的樹與t2完全相同。方法一 在規模較小且較簡單的問題中,我們可以建立乙個字串,表示中序和前序遍...
磁共振中的T1, T2 和 T2 的原理和區別
從物理的角度,要理解這幾個概念的區別,需要對原子核的磁化有所了解,本文通過一些圖示對這幾個概念進行簡明的介紹。首先,磁共振最基本的原理就是氫原子核在磁場中自旋運動時所具有的量子力學特性。在乙個均勻磁場b0中,氫原子核的旋轉 spin 會出現兩種自旋狀態,一種是沿著磁場方向 up狀態 一種是沿著磁場反...