【学习笔记】[省选联考 2023] 人员调度
我们尝试把一个复杂的问题尽量简单化。
每个时刻,无非出现三种情况:
1.1 1.1 1.1 新增一个员工或者撤掉一个员工
1.2 1.2 1.2 查询当前局面下的答案
这个修改操作看着就很亲切啊。只有新增和删除,那么每个员工就作用于一个询问区间,对于询问操作的序列,我们建立二叉树,那么一个询问的答案就是从它所对应的叶子节点到根的路径上所有员工组成的答案。这是个很具象化的转化。
接下来事实上只用考虑一件事:当新增和撤掉一个员工时,动态维护当前答案。这看着似乎和前面非常矛盾,但是不要忘了在线段树上做 D F S DFS DFS的过程中,是插入了一堆元素后紧接着就撤销其影响,因此是可以做的。
然后考虑怎么计算答案。我们希望找到一个 不依赖于将权值排序的维护方法。考场上我就是用的依赖于权值的维护方法,看来还是感知不够。 事实上这样的工具是能被我们找到的,因为我们可以用树剖维护树上的各种信息。记
s
i
z
u
siz_u
sizu为
u
u
u子树的大小,
s
u
s_u
su为当前状态下子树容纳员工的数目,显然在任意状态下应该满足
s
u
≤
s
i
z
u
s_u\le siz_u
su≤sizu,并且我们能非常严格的说明这是充要的。于是自然而然引出这样的维护方式:设插入的员工为
x
x
x找到
x
x
x到根的路径上深度最大的满足
s
i
z
y
=
s
y
siz_y=s_y
sizy=sy的点,然后将
y
y
y子树内权值最小的点替换掉(如果权值更小),如果找不到那么直接插入就好了。回溯的时候就按顺序把上一步的影响撤销掉就好了。
然后是实现细节。用线段树和树剖维护子树大小, set \text{set} set维护节点上所有权值组成的集合,结合子树内 d f n dfn dfn序是一段区间不难实现查找。这道题就做完了,线段树真是万能的数据结构啊。
复杂度 O ( n log 3 n ) O(n\log^3 n) O(nlog3n)。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17529959.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」