題目鏈結
可以想到,每次肯定是拿最大價值為最優
考慮改變樹上乙個點的值,只會影響它的子樹,也就是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半島 ...