// 鼠标点击特效 //

BalticOI 选做

BalticOI 选做

[BalticOI 2024]Wall

这种做法题解区好像没有,所以讲一下,比较有意思。

答案可以用 Hh 来算。

先考虑 h 的部分,权值一定是 (ai+bi)2n1

重点在于 H 的部分。我们考虑使用这么一种计算方法:[Hd] 。考虑固定一个 d 如何计算答案,那么现在我们就只关心 ai,bi 是否大于等于 d 了,记录 numi 表示 [aid]+[bid] 。在一个序列中,H 大于等于 d 的元素一定是一个连续的区间,我们枚举这个区间 [l,r] ,然后去计算 [l,r] 作为区间内元素都大于等于 d极大区间 的序列数量。

l=r

对于 l 位置本身而言,因为要求区间元素大于等于 d ,故有 numi 种选择。对于 il 而言,要求元素严格小于 d ,所以有 il(2numi) 种选择。

故这种情况的贡献就是 numl×il(2numi)

lr

类似于 l=r 的,两个端点处都要求权值大于等于 d ,所以有 numl×numr 种可能性。既然左右端点确定了,那么 (l,r) 内的元素可以自由选择,故有 2rl1 种可能性。在区间外的元素贡献同 l=r

这种情况的贡献是 (rl+1)×numl×numr×2rl1×i[l,r](2numi)

我们发现 l=r 不过是 lr 的特殊情况。。。

对于这种二元组统计问题,可以想到使用分治结构去计算。我们考虑线段树。

看看答案怎么合并,一个节点的合法二元组由两个儿子内的答案和跨越分治中心的区间 [l,r] 构成。一定需要记录一下三种信息:

  1. ansi 表示区间内所有合法二元组的贡献和。
  2. prewi 表示区间内所有合法的前缀 l 的贡献和。
  3. sufwi 表示区间内所有合法的后缀 r 的贡献和。

先考虑 ansi 的合并。

最为简单的就是 ansi=ansls+ansrs 。然后考虑利用 sufwlsprewrs 合并出答案。这里有一个棘手的点:

  • prewi 记录的信息类似于 (l+1)×numl×2x×j<l(2numj)
  • sufwi 记录的信息类似于 r×numr×2x×j>r(2numj)

事实上,我们需要计算的答案形式与 prewisufwi 都不同。系数不同,贡献 (rl+1) 也与 l+1,r 不同。但是我们可以拆贡献:

(rl+1)×numl×numr×2rl1×i[l,r](2numi) 可以被表示为:

r×numl×numr×2rl1×i[l,r](2numi)

(l+1)×numl×numr×2rl1×i[l,r](2numi)

我们只需要额外维护 prei,sufi 的不带贡献形式 prei,sufi 形式就可以了。

  • prei 记录的信息类似于 numl×2x×j<l(2numj)
  • sufi 记录的信息类似于 numr×2x×j>r(2numj)

那么就有 ansi=(sufwls×prers+sufls×prewrs)

接下来考虑 preiprewi 的转移,sufisufwi 的转移十分类似,这里就不讲了。

prei 也是由两个部分组成:prelsx×prers 。就是前缀在左儿子还是右儿子中的两种情况。记录 segi 表示 i 节点所管辖的线段长度,则左儿子的转移是十分简单的:prei=prels×2segrsprewi 的转移是一模一样的。

考虑 l 在右儿子内,转移的时候左儿子的元素均会贡献 (2numj) 的系数,所以额外记录 ti 表示区间内元素 (2numj) 的积。则:prei=tls×prers

t 本身就是 ti=tls×trs

最后答案就是 ansroot

这么计算的好处在于分治结构可以动态。那么我们让 d 从小到大,对于每一个元素而言,numi 会经历 2110 的过程,在线段树上单点修改一下即可。

时间复杂度 O(nlogn)

[BalticOI 2021] The short shank

提供一个比较好想的做法.

考虑如果一个隔板都不放,那么每一个犯人有两种造反的可能性:

  • 自己造反的时间的时间 tiT .(一类犯人)
  • 自己造反的时间虽然大于 T ,但是存在一个位于其之前的犯人满足 tiT ,并且可以通过传导的方式使得这位犯人在 T 之前造反.(二类犯人)

对于一类犯人,没救了.但是可以通过插入隔板的方式阻断第一类犯人造反后的传导,以减少第二类犯人的造反.接下来需要集中注意力:

性质1:假设对于一个二类犯人 i ,可以通过传导的方式使得其造反的,编号最大的犯人为 fi .则当 fii 之间存在隔板的时候,犯人 i 不会造反.

这个就不需要证明了,应该是比较显然的.所以我们就提取出了若干个区间 [li,ri] .然后需要选择一些点,使得包含这些点的区间尽可能多. 体现在题目中的含义就是:点代表着隔板,一个区间内存在隔板就会减少一个二类犯人的造反.

但是这样也不是很好做,我们猜想区间是否存在一些性质:

性质2:对于两个二类犯人 i,j ,[fi,i],[fj,j] 要么包含,要么不相交.

证明:就是证明不会出现 fi<fj<i<j 的情况出现.注意到 fj 可以使得 j 造反,而不可使得 i 造反.而传导到 j 的时间消耗比 i 大,所以此时 fi 应当是 fj 才对.与假设不成立.所以不会出现仅相交的情况.

我们获得了这个重要性质,像一下,区间要么不相交,要么包含.容易想到树形结构.我们考虑对于一个区间,让最小的,包含其的区间向他连边,就得到了一个森林.

问题进一步被转化为选出若干个节点,使得他们到根的路径并尽可能的大.这个问题十分经典,长链剖分选前 d 长的长链即可.

时间复杂度为 O(nlogn) .因为找到 fi 需要时间,方法有很多.可以使用单调栈二分的方式实现.

posted @   dan-da-dan  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示