析合树建树——2025.7.10 鲜花
析合树建树
大笑江湖
我手拿流星弯月刀
喊着响亮的口号
前方何人报上名儿
有能耐你别跑
我一生戎马刀上飘
见过英雄弯下小蛮腰
飞檐走壁能飞多高
我坐船练习水上漂
啊 林子大有好多的鸟
啊 做好事不让人知道
啊 是是非非惹人恼
啊 啊
江和湖波浪滔滔
看我浪迹多逍遥
谁最难受谁知道
天下第二也挺好
风和雨来的刚好
谁比我的武功高
大笑一声地动山摇
江湖危险快点跑
我骑着小毛驴
身后背着弯月刀
降龙十八掌
只练会了第一招
打得过就打
打不过我就跑
武林争斗是是非非
恩恩怨怨怨何时了
咱辈分比较小
昨天刚报名上道
各路英雄好汉
没事你就别和我瞎闹
如果你认输
我就回家睡大觉
俺娘说输赢不重要
开心才重要
我手拿流星弯月刀
喊着响亮的口号
前方何人报上名儿
有能耐你别跑
我一生戎马刀上飘
见过英雄弯下小蛮腰
飞檐走壁能飞多高
我坐船练习水上漂
啊 林子大有好多的鸟
啊 做好事不让人知道
啊 是是非非惹人恼
啊 啊
江和湖波浪滔滔
看我浪迹多逍遥
谁最难受谁知道
天下第二也挺好
风和雨来的刚好
谁比我的武功高
大笑一声地动山摇
江湖危险快点跑
江和湖波浪滔滔
看我浪迹多逍遥
谁最难受谁知道
天下第二也挺好
风和雨来的刚好
谁比我的武功高
大笑一声地动山摇
江湖危险快点跑
江和湖波浪滔滔
看我浪迹多逍遥
谁最难受谁知道
天下第二也挺好
风和雨来的刚好
谁比我的武功高
大笑一声地动山摇
江湖危险快点跑
江湖危险快点跑
之前写了 朴素析合树计数,其中没写怎么建树,结果模拟赛考了(虽然不需要建就是了),场上推了两个小时无果,破防了,半报复性的写一篇。
省流:只要你知道析合树是什么且不和我一样傻到不会建一个 ST 表判断是否连续就会建。
给出增量法的流程,这里我们认为叶子是析点:
考虑依次插入,用栈维护当前建好的析合树森林的根节点,考虑如何插入一个点。
我们先找到和其能组成连续段的最靠左的点,记为 \(L\)。
考虑重复执行以下操作合并一段后缀,直到合并到 \(L\) 之前:
若最后一个点是合点且和当前点结合以后依然是合点,则将其并到其儿子里,判断结合以后是否是合点可以维护其最靠右的儿子的左端点,判断是否能和新点组成一个连续段即可。
若最后一个点和当前点能组成连续段,则新建一个点并将这两个点视为其儿子,这个点一定是合点。
否则考虑找到最靠后的合法连续段,容易发现一定能找到,合并成一个析点(这个点一定是析点)。
复杂度显然是均摊的,难点在于找 \(L\)。
其实也不难,我们发现连续段满足 \(\max - \min = r - l\),而 \(\max - min \ge r - l\)。所以我们维护 \(\max - \min - l\) 的最靠左的最小值即可。
代码写了,但是没存,就这样吧,看不懂可以看 oi-wiki。
P
垃圾鲜花别浪费我图!
本文来自博客园,作者:xrlong,转载请注明原文链接:https://www.cnblogs.com/xrlong/p/18977695
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。