Bzoj3252 攻略(dfs序 線段樹)

2022-03-07 06:09:36 字數 1296 閱讀 7660

題目鏈結

可以想到,每次肯定是拿最大價值為最優

考慮改變樹上乙個點的值,只會影響它的子樹,也就是dfs序上的乙個區間,

於是可以以dfs序建線段樹,這樣就變成區間問題了

#include #include #define mid int mid=(l+r)>>1,ls=id<<1,rs=id<<1|1

#define ll long long

#define n 200010

using namespace std;

struct xdst[n<<2];

struct infoe[n<<1];

int n,k,tot,head[n],val[n],dfn[n],bel[n],fa[n],r[n],x;

ll ans,sum[n];

bool vis[n];

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}void link(int u,int v)

void dfs(int u)

r[u]=tot;

}void build(int l,int r,int id)

mid;

build(l,mid,ls);

build(mid+1,r,rs);

t[id].x=max(t[ls].x,t[rs].x);

}void pushdown(int id)

void find(int l,int r,int id)

pushdown(id);

mid;

if(t[ls].x>t[rs].x) find(l,mid,ls);

else find(mid+1,r,rs);

t[id].x=max(t[ls].x,t[rs].x);

}void modify(int l,int r,int id,int ql,int qr,int x)

pushdown(id);

mid;

if(ql<=mid) modify(l,mid,ls,ql,qr,x);

if(qr>mid) modify(mid+1,r,rs,ql,qr,x);

t[id].x=max(t[ls].x,t[rs].x);

}int main()

tot=0;dfs(1);

build(1,n,1);

while(k--)

printf("%lld\n",ans);

return 0;

}

BZOJ 3252攻略 dfs序 線段樹

bzoj 3252 攻略 dfs序 線段樹 題目大意 給定一棵以1為根的n個點的樹,樹有點權且點權為正整數,可以選擇k條以根作為起點的路徑,每條路徑的價值即這條路徑上所有點的點權之和。但是選擇一條路徑之後,這條路徑上的所有點的點權會變成0。也就是說,這k條路徑中被重複選擇的點,其點權只能被計算一次 ...

bzoj 3252 攻略 (線段樹 DFS序)

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

bzoj3252攻略 線段樹 dfs序

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