bzoj2809
可以先穷举那个是管理者,然后就发现
其实就是求每个子树选尽可能多的人,使薪水和小于m
这显然是从小往大选,可以用启发式合并
但是用主席树写的更简单一点吧,dfs序之后
每课线段树不仅维护出现出现个数,然后在维护一个区间和(未离散化之前的)
然后类似查找第k大就可以解决了
type node=record
po,next:longint;
end;
link=record
l,r,s:longint;
sum:int64;
end; var tree:array[..*] of link;
v,a,b,c,e,sa,rank,h,p:array[..] of longint;
w:array[..] of node;
n,m,t,tot,len,x,root,i,s:longint;
ans:int64; function max(a,b:int64):int64;
begin
if a>b then exit(a) else exit(b);
end; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure sort(l,r: longint);
var i,j,x:longint;
begin
i:=l;
j:=r;
x:=a[(l+r) div ];
repeat
while (a[i]<x) do inc(i);
while (x<a[j]) do dec(j);
if not(i>j) then
begin
swap(a[i],a[j]);
swap(c[i],c[j]);
inc(i);
j:=j-;
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end; procedure add(x,y:longint);
begin
inc(len);
w[len].po:=y;
w[len].next:=p[x];
p[x]:=len;
end; procedure dfs(x:longint);
var i,y:longint;
begin
i:=p[x];
inc(len);
a[len]:=x;
c[x]:=len;
while i<> do
begin
dfs(w[i].po);
i:=w[i].next;
end;
e[x]:=len;
end; function build(l,r:longint):longint;
var m,q:longint;
begin
inc(t);
if l=r then exit(t)
else begin
q:=t;
m:=(l+r) shr ;
tree[q].l:=build(l,m);
tree[q].r:=build(m+,r);
exit(q);
end;
end; function add(l,r,last,x,y:longint):longint;
var m,q:longint;
begin
inc(t);
if l=r then
begin
tree[t].s:=tree[last].s+;
tree[t].sum:=tree[last].sum+y;
exit(t);
end
else begin
q:=t;
m:=(l+r) shr ;
if x<=m then
begin
tree[q].r:=tree[last].r;
tree[q].l:=add(l,m,tree[last].l,x,y);
end
else begin
tree[q].l:=tree[last].l;
tree[q].r:=add(m+,r,tree[last].r,x,y);
end;
tree[q].sum:=tree[tree[q].l].sum+tree[tree[q].r].sum;
tree[q].s:=tree[tree[q].l].s+tree[tree[q].r].s;
exit(q);
end;
end; function ask(l,r,a,b,k:longint):longint;
var m,s:longint;
p:int64; begin
if l=r then
begin
p:=tree[b].sum-tree[a].sum;
if k>=p then exit(tree[b].s-tree[a].s) //这里要注意下
else exit(k div sa[l]);
end
else begin
m:=(l+r) shr ;
p:=tree[tree[b].l].sum-tree[tree[a].l].sum;
if p>k then
exit(ask(l,m,tree[a].l,tree[b].l,k))
else begin
s:=tree[tree[b].l].s-tree[tree[a].l].s;
exit(s+ask(m+,r,tree[a].r,tree[b].r,k-p));
end;
end;
end; begin
readln(n,m);
for i:= to n do
begin
readln(x,b[i],v[i]);
if x= then root:=i;
add(x,i);
end;
for i:= to n do
begin
a[i]:=b[i];
c[i]:=i;
end;
sort(,n);
tot:=;
rank[c[]]:=;
sa[]:=a[];
for i:= to n do
begin
if a[i]<>a[i-] then
begin
inc(tot);
sa[tot]:=a[i];
end;
rank[c[i]]:=tot;
end;
len:=;
dfs(root);
h[]:=build(,tot);
for i:= to n do
h[i]:=add(,tot,h[i-],rank[a[i]],b[a[i]]);
for i:= to n do
begin
s:=ask(,tot,h[c[i]-],h[e[i]],m);
ans:=max(ans,int64(v[i])*int64(s));
end;
writeln(ans);
end.
bzoj2809的更多相关文章
- BZOJ2809: [Apio2012]dispatching
传送门 主席树经典题. 首先把树搞出来,然后搞出来DFS序.然后离散化点权,在DFS序上建立主席树. 对于每个点对应的区间,查找对应的区间最大的点数即可. //BZOJ2809 //by Cydiat ...
- bzoj1455: 罗马游戏 + bzoj2809: Dispatching(可并堆)
昨天看了可并堆是什么,写的是左偏树 大概就是一棵树 1.有左偏性质,即当前根到左叶子节点距离比到右叶子节点距离大 2.有堆性质,堆顶关键字比子树关键字小 合并两个堆的时候,关键字大的插入到关键字小的那 ...
- 【bzoj2809】 Apio2012—dispatching
http://www.lydsy.com/JudgeOnline/problem.php?id=2809 (题目链接) 题意 给出一棵树,每个节点有两个权值${c}$,${L}$,分别代表花费和领导力 ...
- 左偏树初步 bzoj2809 & bzoj4003
看着百度文库学习了一个. 总的来说,左偏树这个可并堆满足 堆的性质 和 左偏 性质. bzoj2809: [Apio2012]dispatching 把每个忍者先放到节点上,然后从下往上合并,假设到了 ...
- BZOJ2809 [Apio2012]dispatching 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2809 题意概括 n个点组成一棵树,每个点都有一个领导力和费用,可以让一个点当领导,然后在这个点的子 ...
- 【BZOJ2809】[Apio2012]dispatching 可并堆
[BZOJ2809][Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 M ...
- BZOJ2809&&LG1552 APIO2012派遣(线段树合并)
BZOJ2809&&LG1552 APIO2012派遣(线段树合并) 题面 自己找去 HINT 简化一题面就是让你从每个点的子树中以\(<=m\)的代价选取尽可能多的点,然后乘上 ...
- BZOJ2809——[Apio2012]dispatching
1.题目大意:给一棵树和M值,每个点有两个权值C和L,选x个点,这x个点的C值的和不能超过M,且这x个点如果都在某个子树内 定义满意度为x*这个子树的根的L值 2.分析:这是一道可并堆的题目,我们考虑 ...
- 【bzoj2809】[Apio2012]dispatching 左偏树
2016-05-31 15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...
- 【BZOJ-2809】dispatching派遣 Splay + 启发式合并
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2334 Solved: 1192[Submi ...
随机推荐
- Windows Server 2008 R2 安装及配置指南
一.安装需求: 1. 硬件需求条件 硬件 需求 处理器 最低:1.4 GHz(x64处理器) 注意:Windows Server 2008 for Itanium-Based Systems 版本需要 ...
- CentOS 6.7安装Java JDK
1.下载Java JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...
- awk实用技巧
awk '{sum+=$1} END {print "Sum = ", sum}' awk '{sum+=$1} END {print "Average = " ...
- Linq保留字含义
using System; using System.Query; using System.Collections.Generic; class app { static void Main() { ...
- android开发:点击缩略图查看大图
android中点击缩略图查看大图的方法一般有两种,一种是想新浪微博list页面那样,弹出一个窗口显示大图(原activity为背景).另一种就是直接打开一个新的activity显示大图. 1.第一种 ...
- Android 网络视频播放器
项目概要: 1.登录界面 2.播放列表 3.播放界面
- 2014年10月30日-----SQL的基础知识
数据库的概念 结构化查询语言:structured query language 简称:SQL 数据库管理系统:database management system 简称:DBMS 数据库管理员:da ...
- C# 之【线程与进程】
1. 引言 先来个比喻手法: 如果把上课的过程比作进程,那么每个学生就是一个线程,他们共享教室,即线程共享进程的内存空间.每一个时刻,只能一个学生问老师问题,老师回答完毕,轮到下一个.即线程在一个时 ...
- XhProf安装教程–详细教程
wget去这里找最新的包下载,我现在最新的是xhprof-0.9.4.tgz cd /tmp mkdir xhprof && cd xhprof wget http://pecl.ph ...
- 将数字n转换为字符串并保存到s中
将数字n转换为字符串并保存到s中 参考 C程序设计语言 #include <stdio.h> #include <string.h> //reverse函数: 倒置字符串s中各 ...