[luogu1552][派遣]
思路
首先肯定要树形dp,一直没想到怎么用左偏树。如果不断弹出又不断地合并复杂度不就太高了。瞄了眼题解才知道可以直接用大根树。然后记录出当前这棵左偏树的大小(树里面所有点的薪水之和)以及点的个数。然后不断的删点。直到薪水满足条件为止。
代码
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<vector>
#include<bitset>
using namespace std;
typedef long long ll;
const int N = 100000 + 100;
vector<int> son[N];
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
ll m,a[N],w[N],siz[N];
int ch[N][2],fa[N],n,dist[N];
ll ans,num[N];
int merge(int x,int y) {
if(x == 0 || y == 0) return x == 0 ? y : x;
if(a[x] > a[y] || (x > y && a[x] == a[y])) swap(x,y);
ch[y][1] = merge(x,ch[y][1]);
fa[x] = y;
if(dist[ch[y][1]] > dist[ch[y][0]]) swap(ch[y][1],ch[y][0]);
dist[y] = dist[ch[y][1]] + 1;
return y;
}
ll pop(int x) {
int k = merge(ch[x][0],ch[x][1]);
ch[x][1] = ch[x][0] = 0;
siz[k] = siz[x] - a[x];
num[k] = num[x] - 1;
return k;
}
int dfs(int u) {
int nn = son[u].size();
int now = u;
siz[now] = a[now];
num[now] = 1;
for(int i = 0;i < nn;++i) {
int v = son[u][i];
int k = dfs(v);
int ls = merge(k,now);
siz[ls] = siz[k] + siz[now];
num[ls] = num[k] + num[now];
now = ls;
}
while(siz[now] > m) now = pop(now);
ans = max(ans,w[u] * num[now]);
return now;
}
int main() {
n = read(), m = read();
dist[0] = -1;
int rt = 0;
for(int i = 1;i <= n;++i) {
int fat = read();
a[i] = read(),w[i] = read();
son[fat].push_back(i);
if(fat == 0) rt = i;
}
dfs(rt);
cout<<ans;
return 0;
}
一言
我们是如此的担心着未来会发生的事情,因此忘记了慢下来享受现在。
[luogu1552][派遣]的更多相关文章
- 【BZOJ-2809】dispatching派遣 Splay + 启发式合并
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2334 Solved: 1192[Submi ...
- APIO2012派遣
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1196 Solved: 586[Submit ...
- 派遣例程与IRP结构
提到派遣例程,必须理解IRP(I/O Request Package),即"输入/输出请求包"这个重要数据结构的概念.Ring3通过DeviceIoControl等函数向驱动发出I ...
- 数据结构,可并堆(左偏树):COGS [APIO2012] 派遣
796. [APIO2012] 派遣 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者都有且 ...
- IRP派遣操作
IRPTrace工具跟踪IRP 派遣函数(Dispathc Funtion)是windows驱动中的重要概念.驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.用户模式 ...
- IRP 与 派遣函数
什么是派遣函数: 派遣函数是 WIndows 驱动程序中的重要概念.驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.也就是说,派遣函数是用来处理驱动程序提交过来的 I ...
- 《Windows驱动开发技术详解》之派遣函数
驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.用户模式下所有对驱动程序的I/O请求,全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP数据会被“派遣”到不同 ...
- [APIO 2012]派遣
Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者都有且仅有一个上级.为 ...
- 【BZOJ2809】【APIO2012】派遣
Background 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. Description 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者 ...
随机推荐
- BPM与OA的区别
近年来,随着计算机技术的发展和互联网时代的到来,我们已经进入了信息时代,也称为数字化时代,在这数字化的时代里,企业的经营管理都受到了极大的挑战.从上世纪90年代起至今,企业的信息化工作开展的如火如荼, ...
- C# Note30: 软件加密机制以及如何防止反编译
参考文章: C#软件license管理(简单软件注册机制) 软件加密技术和注册机制 .NET中的许可证机制--License 背景 .net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间 ...
- Struts2——namespace、action、以及path问题
简单的介绍下Struts2中的几个简单的问题(namespace.action.以及path问题) namespace(命名空间) Namespace决定了action的访问路径,默认为“”,意味着可 ...
- Windows环境下在IDEA编辑器中spark开发安装步骤
以下是windows环境下安装spark的过程: 1.安装JDK(version:1.8.0.152) 2.安装scala(version:2.11/2.12) 3.安装spark(version:s ...
- webpack模塊打包機
https://blog.csdn.net/qq_38277366/article/details/82907894
- 转载 -- jquery easyui datagrid 动态表头 + 嵌套对象属性展示
代码功能: 1.datagrid 的表头由后台生成,可以配置在数据库 2.datagrid 的列绑定数据 支撑嵌套对象 $(function() { var columns = new Array() ...
- linux寻找依赖文件
在linux下编译安装软件有时候会遇到依赖文件找不到的情况,很多时候可以通过 sudo apt install -f 来解决:实在找不到怎么办,还有一个绝招可以用: 安装 apt-file sudo ...
- Multi-Targeting and Porting a .NET Library to .NET Core 2.0
Creating a new .NET Standard Project The first step for moving this library is to create a new .NET ...
- Editor markdown编辑器
代码示例网址:http://pandao.github.io/editor.md/examples/index.html 引入文件 <link rel="stylesheet" ...
- BZOJ3676[Apio2014]回文串——回文自动机
题目描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. 输入 输入只有一行,为一个只包含小写字 ...