BZOJ 3252攻略 dfs序 線段樹

2021-07-29 13:38:24 字數 1928 閱讀 2601

bzoj 3252 攻略 dfs序+線段樹

題目大意:給定一棵以1為根的n個點的樹,樹有點權且點權為正整數,可以選擇k條以根作為起點的路徑,每條路徑的價值即這條路徑上所有點的點權之和。

但是選擇一條路徑之後,這條路徑上的所有點的點權會變成0。(也就是說,這k條路徑中被重複選擇的點,其點權只能被計算一次)。

求最大價值之和。n<=200000。

題解:一開始以為是dp或者費用流之類的,根本沒有想到是線段樹。

首先維護乙個字首和,每個點x的字首和即x到根的所有點權之和。

然後很明顯就要貪心的來做了,第一次肯定選取字首和最大的那個點。

但是選了這個點之後,這個點到根的路徑上的所有點的點權被「取走(也就是變成0)」了;

那麼觀察可知,如果把x這個點取走,辣麼說它和它的子樹中所有點的字首和都要減去這個點的權值(注意不是字首和)。

於是我們每次選取乙個字首和最大的點,從這個點開始往上走一直走到不能走為止,其間對於每個走過的點都進行上述「取走」操作。

顯然我們的單次修改操作都是針對一顆子樹的,所以顯然想到是dfs序。

又因為我們需要維護這樣乙個資料結構,實現區間減法和詢問整個區間的最值,那麼顯然就是來一發線段樹就可以啦~

然後看複雜度,顯然每次選擇x就把x到根所有的點都取走是不划算的(因為有可能這條路徑上的點已經取走了,不用再取一遍了)

於是我們的策略是記錄每個點是否被刪除,這樣選擇x的話,從x開始一直往上走,走到乙個已經被取過的點就停止。

ps:這道題寫錯了一點地方調了兩個小時……

附上**:

//bzoj 3235

#include#include#include#include#define maxn 200010

#define ull long long

#define debug(x) cerr<<#x<<"="long long val[maxn],ans;int a[maxn];

int rt,dfs_clock,father[maxn],times[maxn],l[maxn],r[maxn];

bool del[maxn];

struct answer

bool operator>(const answer &ans)

bool operator=(const answer &ans)

void operator+=(ull v) };

struct segment*root;

void dfs(int x)

r[x]=dfs_clock;

}void push_up(segment* &rt)

void push_down(segment* &rt)

void build_segment(segment* &rt,int lef,int rig)

int mid=(lef+rig)>>1;

build_segment(rt->lc,lef,mid);

build_segment(rt->rc,mid+1,rig);

push_up(rt);return;

}void update_segment(segment* &rt,int s,int t,ull v)

int mid=(l+r)>>1;

if(rt->plus_tag) push_down(rt);

if(s<=mid) update_segment(rt->lc,s,t,v);

if(midrc,s,t,v);

push_up(rt);return;

}void debug_tree(int x)

void debug_segment(segment *rt)

int main()

// debug_segment(root);cout ln;

} printf("%lld\n",ans);return 0;

}

bzoj 3252 攻略 (線段樹 DFS序)

題目大意 選出k條從葉子節點到根節點的路徑,使路徑上的權值之和最大。注意每個點的權值只能被計算一次。看到這道題的第一反應是最大費用最大流。對於每條邊只有第一次流的時候有價值。那麼根據這個思路,我們其實就是每次選取一條權值之和最大的路徑加入答案,因為每個點的權值只能計算一次,所以路徑上的點子樹中所有葉...

Bzoj3252 攻略(dfs序 線段樹)

題目鏈結 可以想到,每次肯定是拿最大價值為最優 考慮改變樹上乙個點的值,只會影響它的子樹,也就是dfs序上的乙個區間,於是可以以dfs序建線段樹,這樣就變成區間問題了 include include define mid int mid l r 1,ls id 1,rs id 1 1 define ...

bzoj3252攻略 線段樹 dfs序

time limit 10 sec memory limit 128 mb submit 562 solved 238 submit status discuss 題目簡述 樹版 k取方格數 眾所周知,桂木桂馬是攻略之神,開啟攻略之神模式後,他可以同時攻略k部遊戲。今天他得到了一款新遊戲 xx半島 ...