3252: 攻略
3252: 攻略
Time Limit:?10 Sec??Memory Limit:?128 MBSubmit:?392??Solved:?157
[Submit][Status][Discuss]
Description
題目簡(jiǎn)述:樹(shù)版[k取方格數(shù)]//poj3422那是個(gè)最大費(fèi)用流 眾所周知,桂木桂馬是攻略之神,開(kāi)啟攻略之神模式后,他可以同時(shí)攻略k部游戲。 今天他得到了一款新游戲《XX半島》,這款游戲有n個(gè)場(chǎng)景(scene),某些場(chǎng)景可以通過(guò)不同的選擇支到達(dá)其他場(chǎng)景。所有場(chǎng)景和選擇支構(gòu)成樹(shù)狀結(jié)構(gòu):開(kāi)始游戲時(shí)在根節(jié)點(diǎn)(共通線),葉子節(jié)點(diǎn)為結(jié)局。每個(gè)場(chǎng)景有一個(gè)價(jià)值,現(xiàn)在桂馬開(kāi)啟攻略之神模式,同時(shí)攻略k次該游戲,問(wèn)他觀賞到的場(chǎng)景的價(jià)值和最大是多少(同一場(chǎng)景觀看多次是不能重復(fù)得到價(jià)值的) “為什么你還沒(méi)玩就知道每個(gè)場(chǎng)景的價(jià)值呢?” “我已經(jīng)看到結(jié)局了。”Input
第一行兩個(gè)正整數(shù)n,k 第二行n個(gè)正整數(shù),表示每個(gè)場(chǎng)景的價(jià)值 以下n-1行,每行2個(gè)整數(shù)a,b,表示a場(chǎng)景有個(gè)選擇支通向b場(chǎng)景(即a是b的父親) 保證場(chǎng)景1為根節(jié)點(diǎn)Output
輸出一個(gè)整數(shù)表示答案Sample Input
5 24 3 2 1 1
1 2
1 5
2 3
2 4
Sample Output
10HINT
?
對(duì)于100%的數(shù)據(jù),n<=200000,1<=場(chǎng)景價(jià)值<=2^31-1
?
Source
dfs序+線段樹(shù)
【題解】://主要是為了練pb_ds
每次一定是選取一個(gè)點(diǎn),將它子樹(shù)內(nèi)權(quán)值和最大的鏈取走,以后就不會(huì)再選取鏈上的點(diǎn)
那么用堆維護(hù)這一過(guò)程,取最大值,刪去鏈的所有點(diǎn)
復(fù)雜度都為nlogn
#include<cstdio> #include<iostream> #include<ext/pb_ds/priority_queue.hpp> using namespace std; int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; } typedef long long ll; typedef pair<ll,int> pa; typedef __gnu_pbds::priority_queue<pa > heap; const int N=2e5+7; struct node{int to,next; }e[N];int cnt,head[N]; heap q; heap::point_iterator id[N]; int n,K,v[N]; ll ans,mx[N]; void add(int x,int y){e[++cnt].to=y;e[cnt].next=head[x];head[x]=cnt; } void dp(int x){for(int i=head[x];i;i=e[i].next){dp(e[i].to);mx[x]=max(mx[x],mx[e[i].to]);}mx[x]+=v[x];id[x]=q.push(make_pair(mx[x],x)); } void del(int x){q.erase(id[x]);for(int i=head[x];i;i=e[i].next){if(mx[e[i].to]==mx[x]-v[x]){del(e[i].to);break; }} } int main(){n=read();K=read(); for(int i=1;i<=n;i++) v[i]=read();for(int i=1,x,y;i<n;i++) x=read(),y=read(),add(x,y);dp(1); for(int i=1;i<=K&&!q.empty();i++){pa t=q.top();ans+=t.first;del(t.second); }printf("%lld",ans);return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/shenben/p/6291206.html
總結(jié)
- 上一篇: 58 Openstack基础、opens
- 下一篇: 学院菌喊你来领取年终学习奖状啦~~!!!