省选集训 day 2 平衡树
A
注意到每条运动轨迹是已知的,我们的目标就是找到可以选择的最大权值(定义为路径上的特殊点个数)的运动轨迹并支持删除这些点。
找轨迹:利用斜率为
的直线 至少有一个不变的性质寻找 对于边界,可以使用常见手段:延拓一倍平面,也就是变成
行,这样就只会走模运算意义下的直线
注意特殊点公用位置的情况。
同时我们由于从每个特殊点转折后有两个方向,不妨加一个第二维度
因此我们就可以表示出每条链及其方向了。
使用权值线段树维护每一行的开头的轨迹的最大值并记录编号。
然后直接删掉整条链,这部分由于方向确定,所以一个点至多在两条链里,因此总删除复杂度
然后主要的问题在于如何维护每条链的权值,支持动态删点,并且还有可能由于链头被挡住导致只能从链中间取的情况。
因此我们还需要考虑到每一行的归属轨迹。
暴力地,我们直接对涉及到的链只修改被更改的部分。考虑到其运行速度相当快,我们来思考下暴力做法的复杂度。
可以想到,如果一条链产生相当大的时间开销,那么必然是从后面每次都往前删,删很多次,并且这条链不是最长的链,这告诉我们单次取出一条贡献
考虑到在
一种可能的情况是当前链挡住后面某一条很长很长的链,导致其被更新,我们考虑考察这条链的更新次数,其本质还是等差数列级(如果要挡住,每次的链长度不会相同),也就是根号级别。
如有其他hack方法欢迎提出。
B
考虑置换环,一次交换相当于分裂环/合并环。
那么对于这个操作,我们必然是希望不断分裂环让其变为全自环的。
然后怎么操作呢,例如这样一棵树
就无解了
这告诉我们这个环必然得是一个从根到底的一条链上的节点,但是不要求顺序,这也可以解释链的情况必然有解。
考虑如果没有顺序,一个自然的想法是让深度次大与深度最大互换,这样就分裂为两个置换环了。
但是有了按照顺序操作的限制,我们应该怎么办?
你要保证每个环仍然足够鲜活,也就是除了深度最大的点都还能操作
也就是需要有意识地隔离深度最大点
也就是操作一个点后让它变为深度最大点
建立环
例如现在操作
也就是说,需要一个数据结构,维护环分裂,某个方向首次
注意到我们可以以最大
x 方向:
t 方向:
使用 fhq_treap 维护即可。
C
基础题目,线段树合并/启发式合并/可并堆板题。
D
可以发现可以单独维护分子分母,也就是有:
因此会有假设后面若干步得到答案是
可以写作矩阵:
因此答案可以表达为关于序列
考虑操作 W,其实显然有:
注意这里我们需要右乘,其道理是如果将E也表示为这样的形式,那么就不需要考虑
考虑操作 E
其后一种情况可以写为:
同时前一种情况可以描述为
同时我们发现对于上面的那种情况,带入
得到了同样的结果
那么这告诉我们,其实有:
剩下的维护属于平衡树基础操作:维护正反的左右向的矩阵积一共四个即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-12-24 根号分治入门