E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
APIO2012
BZOJ2809 [
APIO2012
]dispatching-左偏树-左偏树学习笔记
题目链接:右转进入题目题目大意:自行参考原题题解:算法是不难想到的,主体是dfs一遍,对于第i个点为管理者的情况,先处理出以第i个点为根的子树中所有点为管理者的答案;(假设已经处理好了)那么要怎么做呢?显然,为了不超过预算,我们要把i这个人和i的子树中的人放到一块去,然后排个序,贪心的选取能力值较小的,能选多少是多少设选了sz个,那么以第i个人为管理者的答案就是sz*L[i]。但这样还是不好处理。
Mys_C_K
·
2023-11-03 15:53
可并堆
BZOJ
学习笔记
左偏树
学习笔记
BZOJ
数据结构
【题解】【bzoj 2809】【
Apio2012
】dispatching
传送门总体思路首先那个乘以\(l_i\)显然不好处理,我们可以简单转化一下问题把它规避掉:给定一棵树,根节点为1。每个点有一个点权\(c_i\)。对于每个点,求以该点为根的子树内最多能取多少个点,使得这些点的点权和不超过一个给定常数\(m\)。(最后的答案就是每个点的答案乘上该点的\(l_i\)的最大值。)是不是清真多了。如果不是要求每个点的答案,只是要求根节点的答案,是不是很简单?一个贪心就可以
UnyieldingTrilobite
·
2020-08-13 12:00
[BZOJ2809][
Apio2012
]dispatching(枚举&dfs序+主席树||可并堆||splay+启发式合并)
题目描述传送门题解1°主席树枚举每一个忍者当管理者,由于选忍者的顺序满足薪水单调不减,可以用dfs序+主席树维护出子树中权值之和小于等于k最多有多少个。维护的时候需要维护sum权值和以及s满足条件的忍者的个数。注意建的是权值线段树。2°可并堆3°splay+启发式合并代码主席树#include#include#include#includeusingnamespacestd;#defineLLlo
Clove_unique
·
2020-08-04 11:46
题解
贪心
可持久化
dfs序
[
APIO2012
]派遣 (平衡树启发式合并)
[
APIO2012
]派遣(平衡树启发式合并)题目大意:大概是这样的,一棵树n个点,每个点有点权val[i]和cost[i],给定一个m,对于每颗子树,计算出一个w值,w的计算方法为(val[i]*k),
No__stop
·
2020-07-31 14:07
平衡树
bzoj2811
apio2012
守卫 guard 贪心
题目意思很好理解(为什么我会想到查分约束QAQ),正解居然是贪心(apio和noi/noip系列确实还是赶脚不一样)首先要做的是把一定没有忍者的区间删除。用线段树操作比较方便,之后给每一个没被删除位置(从1---n)一个新的编号,为了将读入的区间重新表示出来(即要使读入的L,R都应该在没被删的地方),假设区间为(L,R),如果L所处被删,自然应该去找L右边第一个没被删的,R则为左边。两次扫描就可以
sjwk2017
·
2020-07-05 12:33
OI
bzoj2809
apio2012
派遣
直观思想是要找到以每个点为根的子树里,最多能有多少个节点薪水和不大于M,也就是要去把最小的点统计起来,乍一眼像是一个维护最小薪水的可并堆,但是考虑到必须要有出堆操作来使时间更优,而出堆元素越大越好,综上,维护一个子树中最大薪水的可并堆。DFS到一个点x时,先递归处理子树,再一个个合并儿子节点所代表的堆,并且在合并后进行不断的pop操作来删除超额节点,最后录入x的信息,每次去个max即可。代码如下。
sjwk2017
·
2020-07-05 12:32
OI
bzoj2809【
APIO2012
】dispatching
2809:[
Apio2012
]dispatchingTimeLimit: 10Sec MemoryLimit: 128MBSubmit: 2579 Solved: 1336[Submit][Status
AaronGZK
·
2016-05-31 23:00
bzoj
可并堆
BZOJ2809——[
Apio2012
]dispatching
1、题目大意:给一棵树和M值,每个点有两个权值C和L,选x个点,这x个点的C值的和不能超过M,且这x个点如果都在某个子树内定义满意度为x*这个子树的根的L值2、分析:这是一道可并堆的题目,我们考虑每一个子树,我们想让其中的选的点尽量多但是C和却不超过M我们只需取C值最小的,次小的,第三小的……直到不能选为止,这个不是很简单吗,不就是一个堆吗不对,难道对于每一个子树都要建一个堆吗,那不是爆了吗,我们
qzh_1430586275
·
2016-05-18 08:00
左偏树
dispatching
bzoj
2809
APIO2012
[BZOJ2809][
Apio2012
]dispatching(枚举&dfs序+主席树||可并堆||splay+启发式合并)
题目描述传送门题解1°主席树枚举每一个忍者当管理者,由于选忍者的顺序满足薪水单调不减,可以用dfs序+主席树维护出子树中权值之和小于等于k最多有多少个。维护的时候需要维护sum权值和以及s满足条件的忍者的个数。注意建的是权值线段树。2°可并堆3°splay+启发式合并代码主席树#include #include #include #include usingnamespacestd; #defin
Clove_unique
·
2016-05-13 20:00
枚举
bzoj
apio
dfs序
主席树
bzoj 2809: [
Apio2012
]dispatching(可并堆)
2809:[
Apio2012
]dispatchingTimeLimit: 10Sec MemoryLimit: 128MBSubmit: 2512 Solved: 1295[Submit][Status
clover_hxy
·
2016-05-05 15:00
[贪心] BZOJ 2811 [
Apio2012
]Guard
好恶心的贪心大概就是先把不可能有的去掉然后把区间合并有包含的大区间去掉如果只剩K个空输出结束剩下区间扫一遍如果一个区间内只剩一个空删掉这个空加入答案然后对于每个位置如果让它不放覆盖剩余区间所需的个数如果大于K这个空必选*对于覆盖前t个区间至少要几个可以用DP#include #include #include usingnamespacestd; inlinecharnc() { staticc
u014609452
·
2016-05-04 13:00
[BZOJ2811][
Apio2012
]Guard(线段树+贪心+二分)
题目描述传送门题解首先用线段树来判断一下某一个点是否一定没有忍者。然后加一个特判,如果一定没有忍者的点的数量已经等于n-k的话,剩下的点一定都有忍者,直接输出。因为有一些点是一定没有忍者的,可以将这些点在整个序列上扣掉,然后将其他有意义的点重新编号。重新编号之后原来合法的区间的左右端点有可能是不合法的,那么就要将区间缩一下,方法是处理pre和next分别表示当前点前面和后面第一个可能有忍者的点,然
Clove_unique
·
2016-05-03 22:20
题解
贪心
线段树
二分
[BZOJ2811][
Apio2012
]Guard(线段树+贪心+二分)
题目描述传送门题解首先用线段树来判断一下某一个点是否一定没有忍者。然后加一个特判,如果一定没有忍者的点的数量已经等于n-k的话,剩下的点一定都有忍者,直接输出。因为有一些点是一定没有忍者的,可以将这些点在整个序列上扣掉,然后将其他有意义的点重新编号。重新编号之后原来合法的区间的左右端点有可能是不合法的,那么就要将区间缩一下,方法是处理pre和next分别表示当前点前面和后面第一个可能有忍者的点,然
Clove_unique
·
2016-05-03 22:00
线段树
二分
贪心
apio
bzoj
bzoj 2811: [
Apio2012
]Guard(线段树+二分)
2811:[
Apio2012
]GuardTimeLimit:10SecMemoryLimit:128MBSubmit:555Solved:262[Submit][Status][Discuss]DescriptionInputOutputSampleInput534121341440451SampleOutput35HINT
clover_hxy
·
2016-05-03 21:03
二分
贪心
线段树
bzoj 2811: [
Apio2012
]Guard(线段树+二分)
2811:[
Apio2012
]GuardTimeLimit: 10Sec MemoryLimit: 128MBSubmit: 555 Solved: 262[Submit][Status][Discuss
clover_hxy
·
2016-05-03 21:00
[可并堆] BZOJ 2809 [
Apio2012
]dispatching
考虑倒着想每次弹出最大值知道费用 #include #include #include usingnamespacestd; typedeflonglongll; inlinecharnc() { staticcharbuf[100000],*p1=buf,*p2=buf; if(p1==p2){p2=(p1=buf)+fread(buf,1,100000,stdin);if(p1==p2)re
u014609452
·
2016-04-30 21:00
bzoj2809: [
Apio2012
]dispatching
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2809思路:很明显忍者之间的关系是一个树形结构先自底向上枚举管理者x,那么根据题意,我们就要从x的子树中选择尽量多的忍者,且工资总和不超过m用一个可并堆到一个点x,就把它的儿子节点的可并堆并起来显然优先选工资低的,那么维护大根堆,不停地删堆顶,直到工资满足预算即可#include #inclu
thy_asdf
·
2016-04-22 15:00
bzoj 2809: [
Apio2012
]dispatching
线段树合并or可并堆or树上主席树我写的线段树合并,注意query递归到最后要returnsum/x,就是只剩一个数,但是个数太多。 #include #include #include #include #definelllonglong #defineinf1e9 #defineeps1e-8 #definemd #defineN100010
heheda_is_an_OIer
·
2016-04-19 16:00
[BZOJ2809] [
APIO2012
] dispatching - 可并堆
2809:[
Apio2012
]dispatchingTimeLimit: 10Sec MemoryLimit: 128MBSubmit: 2366 Solved: 1209[Submit][Status
whzzt
·
2016-04-09 19:00
2809: [
Apio2012
]dispatching|splay启发式合并
倒着枚举每个忍者,找出他所在的集合中在总薪水 #include #include #include #include #include #include #include #include #include #definelllonglong #defineN1000005 usingnamespacestd; intsc() { inti=0,f=1;charc=getchar(); while
ws_yzy
·
2016-03-06 15:00
Splay启发式合并
【BZOJ 2809】 [
Apio2012
]dispatching
Description在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为 Master。除了 Master以外,每名忍者都有且仅有一个上级。为保密,同时增强忍者们的领导力,所有与他们工作相关的指令总是由上级发送给他的直接下属,而不允许通过其他的方式发送。现在你要招募一批忍者,并把它们派遣给顾客。你需要为每个被派遣的忍者支付一定的薪水,同时使
抬头仰望浮云飘过
·
2016-03-01 07:00
左偏树初步 bzoj2809 & bzoj4003
bzoj2809:[
Apio2012
]dispatching把每个忍者先放到节点上,然后从下往上合并,假设到了这个点总值大于预算,那么我们把这个大根堆的堆顶弹掉就好了,剩下的就是可合并堆。
y7070
·
2016-02-06 00:00
bzoj2809: [
Apio2012
]dispatching
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2809题意:中文题。。分析:稍微分析下其实就知道要从叶子往根贪心保留薪水最少的人,因为只要算人头数和根的领导能力,所以从叶子往根合并是发现花费超过了总预算就可以删除薪水高的忍者。代码:#include #include #include #include #include #include #i
Fsss_7
·
2016-01-20 15:00
bzoj2809: [
Apio2012
]dispatching
题目bzoj2809Description在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为Master。除了Master以外,每名忍者都有且仅有一个上级。为保密,同时增强忍者们的领导力,所有与他们工作相关的指令总是由上级发送给他的直接下属,而不允许通过其他的方式发送。现在你要招募一批忍者,并把它们派遣给顾客。你需要为每个被派遣的忍者支付一
zmh964685331
·
2016-01-15 12:00
bzoj 2809(可并堆(斜堆,左偏堆))
2809:[
Apio2012
]dispatchingTimeLimit: 10Sec MemoryLimit: 128MBSubmit: 2083 Solved: 1066[Submit][Status
M_AXSSI
·
2015-12-06 10:00
指令总预算BZOJ 2809([
Apio2012
]dispatching-Splay启发式合并)
2809: [
Apio2012
]dispatching  
·
2015-11-13 06:45
Dispatch
[
APIO2012
巡逻]
[关键字]:动态规划 [题目大意]:说也说不清楚 //===================================================================== [分析]:k=1很好做就是求出最长链就行了,因为假如这条链后必定会产生环,而环上的点必定只需走一次,所以答案就是2*(n-1)-s,s就是最长链的长度。k=2时也可以求最长链,由k=1时可以看出最长链
·
2015-11-13 00:58
2012
APIO2012
APIO2012
只拿回来了一个铜牌,貌似是二中的第三块APIO铜牌。
·
2015-11-12 17:49
2012
【
APIO2012
】【BZOJ2809】派遣dispatching
2809:[
Apio2012
]dispatchingTimeLimit:10SecMemoryLimit:128MBSubmit:1932Solved:967[Submit][Status][Discuss
CreationAugust
·
2015-08-08 07:00
平衡树
启发式合并
【左偏树】【APIO】Dispatching
2809:[
Apio2012
]dispatchingTimeLimit:10SecMemoryLimit:128MB Submit:1932Solved:967 Description在一个忍者的帮派里
morestep
·
2015-08-07 20:00
BZOJ 2809 [
Apio2012
]dispatching 可并堆
题意:链接方法:可并堆解析:水题,但注意过程爆int.方法就是找到树的根节点,之后扫,将每个子树什么的看做一个堆,然后之间合并,如果堆中的sum和超过了m,则去掉最大的,继续添加,这个显然啊。然后每次处理完一个点,用堆中解更新答案。比前两道水代码:#include #include #include #include #defineN100100 usingnamespacestd; typede
wzq_QwQ
·
2015-07-23 20:00
代码
合并
【BZOJ 2809】 [
Apio2012
]dispatching
2809:[
Apio2012
]dispatchingTimeLimit: 10Sec MemoryLimit: 128MBSubmit: 1494 Solved: 725[Submit][Status
Regina8023
·
2015-03-13 18:00
OI
左偏树
bzoj
[
APIO2012
]派遣 解题报告
[
APIO2012
]派遣【问题描述】 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为Master。
TA201314
·
2015-01-09 20:00
heap
贪心
BZOJ 2809
APIO2012
dispatching Treap+启发式合并 / 可并堆
题目大意:给定一棵树,选定一棵子树中的一些点,薪水和不能超过m,求点的数量*子树根节点的领导能力的最大值考虑对于每个节点,我们维护一种数据结构,在其中贪心寻找薪金小的雇佣。每个节点暴力重建一定不行,我们考虑可并数据结构,每个节点将子节点的信息直接合并即可可以用启发式合并的Treap,也可以用可并堆今天特意去学了这玩应0.0先写了左偏树然后又写了下随机堆……后者速度上更快一些不过建议从左偏树开始学起
PoPoQQQ
·
2014-10-24 12:00
treap
bzoj
启发式合并
BZOJ2809
可并堆
【BZOJ】【P2809】【
APIO2012
】【dispatching】【题解】【左偏树】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2809题意就是给定一棵树,每个节点有两个属性C(薪水),L(领导力),找出一个节点u和u的子节点S(sigmaS.C m的时候就pop堆中最大元素,子节点枚举完成后就合并成根节点,边走边记录ans的最大值,然后就完了,代码不长,应该很容易读懂Code:#include #include #in
u012732945
·
2014-05-02 17:00
bzoj
省选
【
apio2012
】网络流
虽然apio没去,但是讲课资料还是值得研究第2~4道题还没怎么见过,其他几道就比较老了TransformMatrixmt在wc2010的校内讲课中讲过,但是只记得听过这道题了,不过重新推发现思路还比较清晰,首先我们可以将任意1移至一个0而不影响其他的数字,假设是0就直接交换,如果是1,可以看做是接力,由于1是等价的,所以可以看做穿过去,那么我们就只需将初始状态的1与目标状态的1一一对应,并处理好了
huyuncong
·
2012-05-24 20:00
c
算法
网络
OO
任务
2010
APIO2012
比赛总结
【dispatching】(这题国内数据极弱,暴力能80,下面的解法1,平衡树即使用SplayTree实现都能AC)枚举管理者所在的结点,然后在这个结点及其所有后代中找到权值前K小的,使得它们的权值和不超过限制,要求求出K的最大值。解法1:将每个结点及其所有后代的权值存在一个平衡树里,然后,对于每个结点,若不是叶结点,就将其所有的子树中,找到最大的那棵子树,它所表示的平衡树不动,将其它的子树表示的
Mato is No.1
·
2012-05-12 21:00
上一页
1
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他