E62 树形DP P8677 [蓝桥杯 2018 国 A] 采油

视频链接:E62 树形DP P8677 [蓝桥杯 2018 国 A] 采油_哔哩哔哩_bilibili

 

 

P8677 [蓝桥杯 2018 国 A] 采油 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

复制代码
// 树形DP+贪心 O(nlogn)
#include<bits/stdc++.h>
#define N 100010
using namespace std;

vector<int> e[N];
int n,B[N],S[N],f[N],len;
struct man{int b,s;};
bool cmp(man x,man y){
  return x.b-x.s>y.b-y.s;
}

void dfs(int u,int fa){
  vector<man> t;
  t.push_back({B[u],S[u]});
  for(auto v:e[u]){
    if(v==fa) continue;
    dfs(v,u);
    S[u]+=S[v];
    t.push_back({f[v],S[v]});
  }
  sort(t.begin(),t.end(),cmp);
  for(auto i:t) f[u]+=i.s;
  f[u]+=max(t.back().b-t.back().s,0);
}
int main(){
  scanf("%d",&n);
  for(int i=1;i<=n;++i)scanf("%d",&B[i]);
  for(int i=1;i<=n;++i)scanf("%d",&S[i]);
  for(int i=2,a,b;i<=n;++i){
    scanf("%d%d",&a,&b);
    e[i].push_back(a),e[a].push_back(i);
    len+=b*2;
  }
  dfs(1,0);
  printf("%d %d\n",len,f[1]);
}
复制代码

 

复制代码
// 贪心 O(nlogn)
#include<bits/stdc++.h>
#define N 100010
using namespace std;

int n,B[N],S[N],t[N],len,ans,mx;

int main(){
  scanf("%d",&n);
  for(int i=1;i<=n;++i)scanf("%d",&B[i]),mx=max(mx,B[i]);
  for(int i=1;i<=n;++i)
    scanf("%d",&S[i]),ans+=S[i],t[i]=B[i]-S[i];
  for(int i=2,a,b;i<=n;++i){
    scanf("%d%d",&a,&b);
    len+=b*2;
  }
  sort(t+1,t+n+1);
  ans+=max(t[1],0);
  ans=max(ans,mx);
  printf("%d %d\n",len,ans);
}
复制代码

 

posted @   董晓  阅读(144)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2023-10-10 C43 线段树+暴力区修 P4145 上帝造题的七分钟 2
点击右上角即可分享
微信分享提示