「Luogu1552」[APIO2012]派遣

最近状态都不是很好,写完这个题感觉手感好像恢复了一些


problem

Solution

这个数据范围显然树形DP是做不了的

我们考虑,在预算范围内,选中的忍者越多越好,那么我们在一棵子树中选中的忍者一定是薪水最少的若干个

对每个节点维护一个大根堆,并记录每个堆的大小和堆中元素的权值和

考虑一棵子树时,用类似树形DP的方法将所有儿子合并到根

如果堆中元素权值和大于预算,不断弹出堆顶直到权值和不大于预算即可

最后对子树进行统计,更新答案

可并堆可以用左偏树实现

另外,还需要记录每个节点对应的左偏树的根的编号

Code

一开始没开long long还wa了一发

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;template <typename T>void read(T &t)
{t=0;int f=0;char c=getchar();while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){t=t*10+c-'0';c=getchar();}if(f)t=-t;
}const int maxn=100000+5;
int n,root;
ll m;
ll mng[maxn];
ll ans;struct edge
{int u,v,nxt;
}g[maxn];int head[maxn],ecnt;
void eADD(int u,int v)
{g[++ecnt].u=u;g[ecnt].v=v;g[ecnt].nxt=head[u];head[u]=ecnt;
}int rec[maxn];
struct node
{int ls,rs,dist;ll val,siz,sum;
}mxh[maxn];int Merge(int x,int y)
{if(!x || !y)return x+y;if(mxh[x].val<mxh[y].val)swap(x,y);mxh[x].rs=Merge(mxh[x].rs,y);if(mxh[mxh[x].ls].dist<mxh[mxh[x].rs].dist)swap(mxh[x].ls,mxh[x].rs);mxh[x].dist=mxh[mxh[x].rs].dist+1;mxh[x].siz=mxh[mxh[x].ls].siz+mxh[mxh[x].rs].siz+1;mxh[x].sum=mxh[mxh[x].ls].sum+mxh[mxh[x].rs].sum+mxh[x].val;return x;
}int Pop(int x)
{int ls=mxh[x].ls,rs=mxh[x].rs;return Merge(ls,rs);
}void dfs(int u)
{for(register int i=head[u];i;i=g[i].nxt){int v=g[i].v;dfs(v);rec[u]=Merge(rec[u],rec[v]);}while(mxh[rec[u]].sum>m && mxh[rec[u]].siz)rec[u]=Pop(rec[u]);ans=max(ans,1ll*mxh[rec[u]].siz*mng[u]);
}int main()
{read(n),read(m);for(register int i=1;i<=n;++i){int u;read(u),read(mxh[i].val),read(mng[i]);mxh[i].sum=mxh[i].val;mxh[i].siz=1;rec[i]=i;if(u)eADD(u,i);else root=i;}dfs(root);printf("%lld",ans); return 0;
}

转载于:https://www.cnblogs.com/lizbaka/p/10657928.html

「Luogu1552」[APIO2012]派遣相关推荐

  1. 「BJOI2019」

    #4372. 「BJOI2019」排兵布阵 题目描述: 小 C 正在玩一款排兵布阵的游戏.在游戏中有 $n$ 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 $m$ 名士兵,可以向第 $i$ 座 ...

  2. 如何直观地理解「协方差矩阵」?

    如何直观地理解「协方差矩阵」? Xinyu Chen Urban Traffic Data Analytics 372 人赞同了该文章 协方差矩阵在统计学和机器学习中随处可见,一般而言,可视作方差和协 ...

  3. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!

    构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...

  4. 不带头节点的链表有哪些缺点_23张图!万字详解「链表」,从小白到大佬!

    链表和数组是数据类型中两个重要又常用的基础数据类型. 数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动,为了解 ...

  5. 一位老码农的分享:一线程序员该如何面对「中年危机」?

    如果这是第二次看到我的文章,欢迎文末扫码订阅我个人的公众号(跨界架构师)哟~   本文长度为2728字,建议阅读8分钟. 坚持原创,每一篇都是用心之作- 先来聊一下这个问题的背景吧. 前两天有小伙伴问 ...

  6. 机器人 Ameca「苏醒」瞬间逼真到令人恐惧,网友纷纷惊叹……

    整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 近日,国内外网友都被一段机器人「苏醒」的视频惊讶到. 视频开始时,机器人似乎已经睡着,眼睛闭着,头部略微向下倾斜.随着肩膀的伸展 ...

  7. AI 复活「她」! GPT-3 帮美国小哥复刻逝去未婚妻,但又夺走她……

    整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 今年 7 月,一名33岁的美国小哥 Joshua Barbeau 在未婚妻去世后,根据她在 Facebook 和 twitter ...

  8. OpenAI 以 10 亿美元出售「灵魂」,网友热评不再「Open」

    编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) OpenAI 如何以 10 亿美元的价格出售其灵魂:GPT-3 和 Codex 背后的公司并不像它声称的那样开放. 当金钱成为障 ...

  9. 「软件」2.0时代已经到来,你需要这样的开发工具

    互联网催生了软件的繁荣,而在AI浪潮的推动下,软件正在朝着更「智能」的方向发展,也就是「软件2.0」时代.「软件2.0」其实就是神经网络,也就是这一波AI浪潮的基石. 在「软件1.0」时代,程序员用J ...

最新文章

  1. python yield yield from
  2. post发送 ArrayBuffer
  3. 选择加冒泡排序法与找鞍马之总结与感受
  4. 那些年,因为英语不好所闹出的笑话!
  5. 在Windows 7或Vista资源管理器中禁用缩略图预览
  6. 2019年了,C#发展的怎么样了呢?
  7. 显示三维图片序列_SLAM结合三维检测
  8. Ubuntu 扩展内存或断电之后卡在 /dev/sda1 clean 和 /dev/sda1 recovering journal
  9. 索引 | 学堂原创推文汇总-v2
  10. 杰理之测试盒配置声道【篇】
  11. 2018年美赛E题M奖论文心得分享
  12. 关于ESAPI无法打印debug级别日志
  13. Computer:路由器连接交换机怎么建立局域网
  14. 风力摆控制系统(B 题 本科组)-- 2015 年全国大学生电子设计竞赛试题
  15. python创意网络爬虫_基于Python专用型网络爬虫的设计及实现
  16. c语言中shift f12组合建,如何在word中将文本框组合快捷键是什么
  17. axure树形表格_树状菜单 表格 水平菜单 垂直菜单
  18. LQR:Linear Quadratic Regulator 线性二次型调节器
  19. Hdu2184汉诺塔VIII
  20. 讲述近十几年的房地产

热门文章

  1. 使用Live Writer和NNTP Bridge阅读微软论坛
  2. 采购杀毒软件,你说话能算数么?
  3. 三本新书(包含新系列)隆重上市
  4. AccountManagment
  5. dalvik对于Java方法调用的实现
  6. v8学习笔记(四) 对象机制
  7. PCA原理分析和意义(二)
  8. Kafka性能强于RabbitMQ的原因
  9. Flutter如何与Native(Android)进行交互
  10. Orleans 高级特性-目录