考試的時候,本來想拿60的貪心,但是只拿了15……很不開心!
不過現在知道正解了qwq……
對於每個點,都開乙個優先佇列,這個優先佇列裡的值,代表這個點的子樹分成的若干個集合中最大的值。
那麼我們對於乙個沒有處理的點,分別列舉每乙個子樹,分別合併每乙個優先佇列,最後再加入這個點,得到新的優先佇列。
對於正確性,由於每乙個點都會單獨加入優先佇列,所以這個點和子樹中的任何乙個點都不是同一集合,滿足了題意,並且每一層的合併肯定是最優,大的和大的合併。
對於時間,由於每乙個點都會被進行上述操作,所以 n * ,對於列舉每個兒子的優先佇列,視為 logn ,刪除 logn ,所以複雜度o(n * log2n)。
考試沒想出來……嗚嗚嗚
#include#include#include
#define mogeko qwq
#define ll long long
using
namespace
std;
const
int maxn = 2e5+10
;int
n,f,cnt;
ll w[maxn],tem[maxn],id[maxn];
ll ans;
inthead[maxn],to[maxn],nxt[maxn];
priority_queue
q[maxn];
void add(int x,int
y)void dfs(int
u)
if(q[id[v]].size() >q[id[u]].size()) swap(id[u],id[v]);
int cnt = 0
;
while(!q[id[v]].empty())
for(int i = 1; i <= cnt; i++)
q[id[u]].push(tem[i]);
}q[id[u]].push(w[u]);
}int
main()
dfs(1);
while(!q[id[1
]].empty())
printf(
"%lld
",ans);
return0;
}
P5290 十二省聯考2019 春節十二響
傳送門 考慮乙個子樹裡是怎麼劃分的,維護劃分出來的每個集合的最大值,這個可以用乙個 multiset 維護 設 s x 表示節點 x 的子樹中,最優劃分 劃分出來的每個塊的節點最大值 首先葉子節點的集合顯然只有它本身 然後考慮子樹之間的合併,設兩個子樹根節點為 x,y 因為兩個子樹之間一定不會有祖先...
洛谷P5290 春節十二響
傳送門 qaqqaq 題意 給你一棵樹,每個點有權值,把樹上 n 個點分成若干個集合,每個集合中的元素兩兩之間不存在祖先關係,使得每個集合中的最大值之和最小 思路 觀察部分分,我們會發現有乙個 鏈 的樣例。我們看鏈的思路 1為頂點,那麼1兩端就是兩條鏈,每個集合中每條鏈只能包含1個元素,然後1頂點單...
十二省聯考2019 遊記
在機房呆了一天,大概看了看原先寫過的題,有點頹。下午的時候和大家一起打掃了一下機房。走的時候,看著空無一字的黑板,風吹起的棕黃色窗簾,遠方的藍色天空,有一種很濃厚的哀傷。時間過得真快啊,轉眼就是省選了呢。許是要退役了吧?許是要退役了吧。下午去試機了,感覺鍵盤不太星啊。考場倒是換了乙個地方 但是不讓我...