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半島 ...