把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

CTS2024

水镜

先考虑如何判定一个区间 [l,r] 是否合法。

首先肯定存在一个分割点 mid,使得 [l,mid]min(hi,2Lhi)(mid,r]max(hi,2Lhi)

因此,记 pi=max(hi,2Lhi),则 pi 需要先不升,再不降,并且只能在转弯处有至多一对相等。

考虑其反面,也即不存在 pi1pipi+1。对于每个 i,这会导出一个限制,为 L[l,r],则判定一个区间是否合法只需要判定所有限制的并是否为全集即可。

又因为答案具有单调性,所以双指针即可,判定全集有一万种方法,时间复杂度 O(nlogn)

线段树

记线段树 i 点的区间为 [Li,Ri)

首先需要做一个转化:对于线段树上第 i 个点,如果我们知道其权值,就将 LiRi 之间连一条边,那么 [li,ri) 的权值可以求出充要于 liri 联通。

把线段树这个图放到平面图,会发现这是一个三角剖分类似物,因此对于第 i 个点,会有两种情况:

  • LiRi 联通,并且子树内的联通已经处理好了,子树内到子树外的联通要求都和 Li 联通了。
  • LiRi 不联通,并且存在一个 j,使得子树内所有没有跨过 j 的联通要求都满足了,跨过 j 的联通要求都一端和 Li 联通,一端和 Ri 联通。

则我们将第一种记作 fi,第二种记作 dpi,j

ff 之间的转移是平凡的。

fdpi 的转移不会改变 j,因此是一个整体乘法。

dpu,xdpv,y 的转移需要要求跨过 x,y 的限制相同,也就是,(x,y] 的要求都在 midi 满足了。这个可以用 xor-hash 处理出等价类,然后在等价类之间转移。

最后在 i 点的 dpi 还要整体转移到 fi

上述过程可以用线段树合并维护,时间复杂度 O(nlogn)

submission

众生之门

首先任何一棵树都可以构造出一个排列,满足相邻两个点距离 3,因此答案 3,并且因为奇偶性是确定的,所以答案的最后一位是确定的。因此我们只需要确定答案的倒数第二位是啥就行了。

然后发现,除了菊花和 n 比较小的情况,最后的答案都是 1 的。

但是怎么构造呢?答案是直接随机(。因为你感受一下,你随机一个排列,答案是均匀的,因此每次随机交换两个位置,然后计算新的贡献即可。

submission

多方计算

首先我们有一个 n+m+logn 的做法:在第 t 个时间将所有第 x 个人的第 y 位满足 x+y+1=t 传到下一个人,并把这一位清空,下一个人将这个值加到对应位置上并进位。这样最多需要增加 logn 位,可以获得 49 分。

这个做法刚开始的时间非常浪费,后面的点都没有传递信息。我们考虑让后面的点从 logn 位开始传递信息,传递一个三角形掉,这样前面的进位就只有 loglogn 个了,就可以做到 n+m+loglogn

这样会比限制多一步,我们只需要让开始的位从略小于 logn 的位置开始。真正限制开始位置的是这一次加法的进位数量,我们将后面的三角形改成对很多平行四边形同时做加法,就可以刚好进这个限制。

submission

投票游戏

首先我们可以求出 fi 表示 i 被票出时候 i 有几票,这样只需要比较 (fc,c)(fd,d) 的大小即可。

首先考虑假设 i 的儿子的 f 都知道是啥了,fi 怎么求。维护一个变量 x=ai+jsonibj, 当票数降到某个 fj 的时候,将 x 减去 bj。当 x 第一次和票数相同的时候就是 fi 的值。这个值可以维护线段树并在线段树上二分快速得到。这样就可以做随机树和菊花的情况。

然后一个自然的想法是轻重链剖分,并在重链上维护一些信息。考虑 i 的重儿子 j,记 i 去掉 j 之后的答案为 gi,则若 fj<gi,则 fi=gi,否则说明 bj 最终一定会被去除,则在线段树上改一下初始值之后再二分出另一种答案即可。

这样我们每个点的答案可以用一个函数表示:

f(t)={At<xBtx

这显然可以线段树快速求一条链上的答案,然后轻边暴力,这个题就做完了,时间复杂度 O(nlognlogV),如果维护儿子的地方写平衡树就可以做到 O(nlog2n)

submission

字符串游戏

occ(i,j) 表示 s[i,j]s[i,n] 中出现次数。

dpi 表示 s[i,n] 的答案,显然有 dp 是 fi=maxj=i+1nocc(i,j1)fj

这个 dp 是 O(n2) 的,非常不牛。为了优化这个 dp,我们需要对这个 dp 观察一些性质。

一个比较容易发现的性质是,如果 i<jfifj,则从 i 转移一定不会比从 j 转移更优,因为 occ(x,i)occ(x,j),所以我们只需要保留 fi 的前缀最小值即可。

但这是不够的。我们还可以注意到,如果在某次转移中,i 的最优转移点是 pi,则 pi 之前的转移点都没有用了。这是因为对于两个 occ(x,i),occ(x,j),i<j,在 x 减一的过程中,occ(x,i) 的减小量 occ(x,j) 的减小量。

这样就可以决策单调性,但是复杂度是两个 log 的,过不了。

我们尝试维护一个单调栈,栈内满足 f 单调递减。每次拿栈顶转移到 i,然后判断 fi 是否小于栈顶,如果小于就把栈顶弹了,否则退出。

这个做法的正确性在于,我们做完之后,记栈顶为 x,一个非栈顶为 y,需要证明 xi 的转移不劣于所有 yi 的转移。

反证,假设 fi=occ(i,y1)fy,则有 fiocc(x,y1)fy=fx<fi,矛盾。因此 fi 转移完备。

所以我们只需要支持求 occ 即可,这个可以倍增+bit 实现,时间复杂度 O(nlogn)

submission

posted @   275307894a  阅读(130)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2023-09-11 QOJ # 5573. Holiday Regifting
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示