春節十二響

2021-09-17 19:09:24 字數 1400 閱讀 4923

題目背景

「清明時節雨紛紛,路上行人欲斷魂。」

2075 年的清明沒有春雨。在漫天飛雪的籠罩下,穿行在冰原間的,只有載著人類微薄希望的雪地車。

遙遙 4.22 光年的征途,對於地球這孤獨的旅人而言,恐怕也是無比寂寞的吧。

題目描述

距離蘇拉威西只有一百公里了,車內的空氣比窗外更加冰冷。四雙眼睛緊盯著艾莉芬面前的螢幕,那是控制行星發動機的關鍵程式:春節十二響。他需要將其部署到電力控制系統的乙個晶元中。

「春節十二響」由 $n$ 個子程式構成,第 $i$ 個子程式所需的記憶體空間是 $m_i$。這 $n$ 個子程式之間的呼叫關係構成了一棵以第 $1$ 個子程式為根的樹,其中第 $i$ 個子程式在呼叫樹上的父親是第 $f_i$ 個子程式。

由於記憶體緊張,電力控制晶元上提供了一種記憶體分段機制。你可以將記憶體分為若干個段 $s_1, s_2, \dots, s_k$,並將每個程式預先分配到乙個固定的段。如果兩個子程式沒有直接或間接的呼叫關係,則他們可以被分配到同乙個段中,反之則不能。換言之,當且僅當 $a$ 和 $b$ 在呼叫樹上**不是祖先-後代關係**,$a$ 和 $b$ 可以被分配到同乙個段中。

乙個段的大小應當是所有分配到這個段的子程式所需記憶體大小的最大值,所有段大小的和不能超過系統的記憶體大小。

現在艾莉芬想要知道,電力控制晶元至少要有多少記憶體,才能保證春節十二響的正確執行。即:最少需要多大的記憶體,才能通過先**將記憶體分成若干個段**,再**把每個子程式分配到乙個段中**,使得**每個段中分配的所有子程式之間不存在祖先-後代關係**。

sol可以發現如果分成的段數最少那麼答案最優。

一棵深度為dep的樹只要要分dep層。

現在考慮怎麼合併兩棵樹:兩個大根堆,每次取較大的堆頂,直到有個堆為空。

類似啟發式合併。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

#define maxn 200005

9using

namespace

std;

10int

n,a[maxn],f[maxn],t[maxn],tp;

11 priority_queueq[maxn];

12int

main()

23long

long ans=a[1

];24

for(;!q[1].empty();q[1].pop())ans+=q[1

].top();

25 cout

26return0;

27 }

view code

posted @

2019-04-09 07:22

liankewei123456 閱讀(

...)

編輯收藏

春節十二響

自己的思路 將樹上所有的鏈存到好幾個陣列裡,每次取出每個陣列的最大值比較,將最大的計入答案。其實很接近正解了。正解 將每個點的子樹合成乙個堆,啟發式合併 由小到大 上 吧 include include include include define ll long long using namesp...

春節十二響 十二省聯考2019

給定一顆樹,要求將其上的節點分成若干組,使得每一組的節點互相不擁有祖先 後代關係。定義每一組的值為該組節點權值最大值,求值總和最小值。硬上不是很顯然的貪心,但是資料中鏈的情況給了提示。考慮鏈的情況 對於根節點兩側的鏈,我們分別排序,然後覆蓋選取即可。這個貪心的正確性是顯然的。現在考慮完整的資料 對於...

十二省聯考2019 春節十二響

點這裡看題目。感覺自己好蠢 假如我們有兩棵樹 t 1,t 2 我們應該怎麼計算出它們合併之後的最優解呢?設最優情況下,t 1 的所有記憶體段的集合為 m 1 t 2 的集合為 m 2 我們可以知道,m 1,m 2 中所有的元素都是不能再合併的 廢話 考慮有 m 1,m 2 in m 1,m 1 m ...