Dada 的待完成题目

· · 个人记录

前言

由于每天晚上 dadaaa 都会因为补不完题而焦头烂额,为了防止过了一段时间之后胡出来的题不记得做法了,因此写一个口胡记录,等有空再实现。

其实就是写不完的题咕咕存放的地方

洛谷链接

QOJ9406

假设我们选出来的三个子串按字典序从小到大排序为 S1,S2,S3。注意到,我们一定不能够让 S3 非常严格的大于 S1,S2,此时无论 S1,S2 怎么拼也拼不出来 \gt S3 的。

此时 S1,S2 一定有一个是 S3 的前缀,且此时剩下那个字典序大于 S3。此时我们可以枚举 S3 的一个前缀,设其为 S1,那么我们的 S2 取值范围是一个区间,二分即可。

怎么比较字典序大小?把所有串拼起来跑 SA 就能实现。

此时注意到,如果我们选择出 S1S2 合法,选择出 S2S1 合法,那么这会算重。会算重的次数是所有 S1>S3-S2S2>S3-S1。这是一个二维数点状物,问题化成 a_i \gt b_j \cap a_j > b_i,考虑扫描线和树状数组维护。(怎么做待更新)

然后就做完了,复杂度 O((n+|S|)\log (n+|S|))

n进制加法

主席树维护加法,点分树数,随机二分即可。

二分到底层控精度。

古籍

转换为 S=S_i \cap S_j, S_i \cap S_j \cap D = \emptyset 的数量。注意到后半部分可以用 1 数量刻画,跑 FWT 即可。复杂度为 O(n^2 2^n)

Haitang and Diameters,16481

点减边容斥,问题变成了求对于每一个点存在两个深度最大值相同的方案数量,可以直接换根解决。

注意到我们是类似于可以前缀和的实现,因此每次合并复杂度为 O(n),总复杂度为 O(n^2)

awaw,NFLS18042

按照 w 分块,每次跑单调队列等数据结构找出总共 O(n) 个方块,每个方块用一点办法找出上下左右的连通方块,跑并查集即可。

复杂度排序后 O(n)

联邦之终,NFLS11255

做过的题,需要把线段树改为平衡树就行了。

第二题,NFLS18061

注意到我们对对于”走一条边最大值的边“这个事情可以颜色段均摊,因此我们只需要写一棵单点修改,区间赋值或区间加减的维护 pair 和的线段树就行了。

切树,NFLSP12956

我们可以很容易的得到一个维护集合的dp,进行一个神秘的 Reduce 操作后,注意到值域跨度原来是 O((R-L)*k),除掉了一个 O(R-L),此时我们只需要维护 O(k) 个就行了。

怎么 Reduce 呢?我们注意到对于 a<b<c,c-a<R-L,那此时我们的 b 是显然没用的,b 任何有用的情况都能够被平替掉,因此任意一个的间隔就是 O(R-L) 了。

总复杂度是 O(NK^4) \to O(NK^3),因为树形背包。

地地铁铁,P8456 NFLS18117

建圆方树分讨。

答案为 All - \text{属于同种颜色的方案} - \text{混合块的特殊处理}

通过很多个桶把复杂度平衡下去。

偷走零件, NFLSP743 BZOJ4647

注意到,我们除了 k=1,剩下的 F_kF_{k+1} 的前缀。

因此我们只需要处理 k=44 的时候这个超级长的序列,询问直接做就行了。

考虑把 A 串和 B 串都变成比 S 串长的情形,此时我们的 S 串子串出现的位置只有 A-BB-AB-B 三种情形。

我们把询问变成:求 \sum_{i=a}^{b-(d-c)} \operatorname{LCP}(C,i)>=d-c+1 状物。然后我们根据 起始点所在串 分类,建出 SA 询问即可。这样做的目的是减少一些分类套路。最后的答案变成一堆 A-B,B-A,B-B 和一个首尾段查询。这东西建主席树是好搞的。

写小心一点。