日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj 2809 Apio2012 dispatching

發布時間:2025/6/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 2809 Apio2012 dispatching 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

在一個忍者的幫派里,一些忍者們被選中派遣給顧客,然后依據自己的工作獲取報償。在這個幫派里,有一名忍者被稱之為?Master。除了?Master以外,每名忍者都有且僅有一個上級。為保密,同時增強忍者們的領導力,所有與他們工作相關的指令總是由上級發送給他的直接下屬,而不允許通過其他的方式發送。現在你要招募一批忍者,并把它們派遣給顧客。你需要為每個被派遣的忍者 支付一定的薪水,同時使得支付的薪水總額不超過你的預算。另外,為了發送指令,你需要選擇一名忍者作為管理者,要求這個管理者可以向所有被派遣的忍者 發送指令,在發送指令時,任何忍者(不管是否被派遣)都可以作為消息的傳遞 人。管理者自己可以被派遣,也可以不被派遣。當然,如果管理者沒有被排遣,就不需要支付管理者的薪水。你的目標是在預算內使顧客的滿意度最大。這里定義顧客的滿意度為派遣的忍者總數乘以管理者的領導力水平,其中每個忍者的領導力水平也是一定的。寫一個程序,給定每一個忍者?i的上級?Bi,薪水Ci,領導力L i,以及支付給忍者們的薪水總預算?M,輸出在預算內滿足上述要求時顧客滿意度的最大值。 1??≤N?≤ 100,000?忍者的個數; 1??≤M?≤ 1,000,000,000?薪水總預算;? 0??≤Bi < i??忍者的上級的編號; 1??≤Ci ≤ M??忍者的薪水; 1??≤Li ≤ 1,000,000,000?忍者的領導力水平。

Input

從標準輸入讀入數據。 第一行包含兩個整數?N和?M,其中?N表示忍者的個數,M表示薪水的總預算。 接下來?N行描述忍者們的上級、薪水以及領導力。其中的第?i?行包含三個整?Bi , C i , L i分別表示第i個忍者的上級,薪水以及領導力。Master滿足B i = 0,并且每一個忍者的老板的編號一定小于自己的編號?Bi < i。

Output

輸出一個數,表示在預算內顧客的滿意度的最大值。

Sample Input

5 4
0 3 3
1 3 5
2 2 2
1 2 4
2 3 1

Sample Output

6

HINT

如果我們選擇編號為 1的忍者作為管理者并且派遣第三個和第四個忍者,薪水總和為 4,沒有超過總預算 4。因為派遣了2 ?個忍者并且管理者的領導力為 3,

用戶的滿意度為 6 ?,是可以得到的用戶滿意度的最大值。

?

?

斜堆看來是真的不會打了。。。

首先這個管理者必須靠枚,對于每個管理者肯定是選子樹中最小的即可。

這個東西用一個大根堆(小根堆也可以)可以維護。每個節點和自己的子樹的堆合并

如果用大根堆寫的話,記錄子樹總和,若大于m就一直pop

附上代碼:

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=100050; 7 int gi() 8 { 9 int x=0; 10 char ch=getchar(); 11 while(ch<'0'||ch>'9') ch=getchar(); 12 while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); 13 return x; 14 } 15 struct Xheap 16 { 17 int v[N],l[N],r[N]; 18 int merge(int x,int y) 19 { 20 if(x==0||y==0)return x+y; 21 if(v[x]<v[y])swap(x,y); 22 r[x]=merge(r[x],y); 23 swap(l[x],r[x]); 24 return x; 25 } 26 void pop(int &x){x=merge(l[x],r[x]);} 27 int top(int x){return v[x];} 28 }heap; 29 int head[N*2],to[N*2],nxt[N*2],L[N],c[N],n,m,tt; 30 int root[N]; 31 long long ans,tot[N],size[N]; 32 void lnk(int x,int y) 33 { 34 to[++tt]=y,nxt[tt]=head[x],head[x]=tt; 35 to[++tt]=x,nxt[tt]=head[y],head[y]=tt; 36 } 37 void dfs(int x,int f) 38 { 39 root[x]=x;size[x]=1;heap.v[x]=c[x];tot[x]=c[x]; 40 for(int i=head[x];i;i=nxt[i]) 41 { 42 int y=to[i]; 43 if(y!=f) 44 { 45 dfs(y,x); 46 size[x]+=size[y]; 47 tot[x]+=tot[y]; 48 root[x]=heap.merge(root[x],root[y]); 49 } 50 } 51 while(tot[x]>m) 52 { 53 tot[x]-=heap.top(root[x]);heap.pop(root[x]); 54 size[x]--; 55 } 56 ans=max(ans,(long long)size[x]*(long long)L[x]); 57 } 58 int main() 59 { 60 n=gi(),m=gi(); 61 int x; 62 for(int i=1;i<=n;i++) x=gi(),lnk(i,x),c[i]=gi(),L[i]=gi(); 63 dfs(1,0); 64 printf("%lld",ans); 65 }

?

轉載于:https://www.cnblogs.com/qt666/p/6484670.html

總結

以上是生活随笔為你收集整理的bzoj 2809 Apio2012 dispatching的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。