「Luogu1552」[APIO2012]派遣
「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]派遣相关推荐
- 「BJOI2019」
#4372. 「BJOI2019」排兵布阵 题目描述: 小 C 正在玩一款排兵布阵的游戏.在游戏中有 $n$ 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 $m$ 名士兵,可以向第 $i$ 座 ...
- 如何直观地理解「协方差矩阵」?
如何直观地理解「协方差矩阵」? Xinyu Chen Urban Traffic Data Analytics 372 人赞同了该文章 协方差矩阵在统计学和机器学习中随处可见,一般而言,可视作方差和协 ...
- 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!
构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...
- 不带头节点的链表有哪些缺点_23张图!万字详解「链表」,从小白到大佬!
链表和数组是数据类型中两个重要又常用的基础数据类型. 数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动,为了解 ...
- 一位老码农的分享:一线程序员该如何面对「中年危机」?
如果这是第二次看到我的文章,欢迎文末扫码订阅我个人的公众号(跨界架构师)哟~ 本文长度为2728字,建议阅读8分钟. 坚持原创,每一篇都是用心之作- 先来聊一下这个问题的背景吧. 前两天有小伙伴问 ...
- 机器人 Ameca「苏醒」瞬间逼真到令人恐惧,网友纷纷惊叹……
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 近日,国内外网友都被一段机器人「苏醒」的视频惊讶到. 视频开始时,机器人似乎已经睡着,眼睛闭着,头部略微向下倾斜.随着肩膀的伸展 ...
- AI 复活「她」! GPT-3 帮美国小哥复刻逝去未婚妻,但又夺走她……
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 今年 7 月,一名33岁的美国小哥 Joshua Barbeau 在未婚妻去世后,根据她在 Facebook 和 twitter ...
- OpenAI 以 10 亿美元出售「灵魂」,网友热评不再「Open」
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) OpenAI 如何以 10 亿美元的价格出售其灵魂:GPT-3 和 Codex 背后的公司并不像它声称的那样开放. 当金钱成为障 ...
- 「软件」2.0时代已经到来,你需要这样的开发工具
互联网催生了软件的繁荣,而在AI浪潮的推动下,软件正在朝着更「智能」的方向发展,也就是「软件2.0」时代.「软件2.0」其实就是神经网络,也就是这一波AI浪潮的基石. 在「软件1.0」时代,程序员用J ...
最新文章
- python yield yield from
- post发送 ArrayBuffer
- 选择加冒泡排序法与找鞍马之总结与感受
- 那些年,因为英语不好所闹出的笑话!
- 在Windows 7或Vista资源管理器中禁用缩略图预览
- 2019年了,C#发展的怎么样了呢?
- 显示三维图片序列_SLAM结合三维检测
- Ubuntu 扩展内存或断电之后卡在 /dev/sda1 clean 和 /dev/sda1 recovering journal
- 索引 | 学堂原创推文汇总-v2
- 杰理之测试盒配置声道【篇】
- 2018年美赛E题M奖论文心得分享
- 关于ESAPI无法打印debug级别日志
- Computer:路由器连接交换机怎么建立局域网
- 风力摆控制系统(B 题 本科组)-- 2015 年全国大学生电子设计竞赛试题
- python创意网络爬虫_基于Python专用型网络爬虫的设计及实现
- c语言中shift f12组合建,如何在word中将文本框组合快捷键是什么
- axure树形表格_树状菜单 表格 水平菜单 垂直菜单
- LQR:Linear Quadratic Regulator 线性二次型调节器
- Hdu2184汉诺塔VIII
- 讲述近十几年的房地产