Dada 的待实现题目

前言

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

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

洛谷链接

QOJ9406

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

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

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

此时注意到,如果我们选择出 \(S1\)\(S2\) 合法,选择出 \(S2\)\(S1\) 合法,那么这会算重。会算重的次数是所有 \(S1>S3-S2\)\(S2>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)\),因为树形背包。

偷走零件, NFLSP743 BZOJ4647

注意到,我们除了 \(k=1\),剩下的 \(F_k\)\(F_{k+1}\) 的前缀。

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

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

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

写小心一点。

CF1515G

没写完。

CF1874

快看懂了,记得写

NFLS15401

假设我们设置 \(k\) 个警报,那么报警的次数为 \(k \log V\)

因此我们在线段树上挂警报,每次区间修改的时候如果子树内有已经报警的警报就继续往下跑,否则打标记。

这样做的话,我们一次报警的复杂度是 \(O(\log^2 n)\)(报警两个,增删警报器两个,因此还是两个)。而对于修改而言,我们只会 \(O(Q\log n)\),因此总复杂度是 \(O(n \log^3 n \log V + Q \log n)\)。这是能过的。

补完后记得学一下二进制警报器,可能有一点用。

NFLS18430

搞出二分图,然后先跑最大匹配,如果最大匹配不是 \(\min(n,m)\) 就爆(因为你树肯定要有最大匹配的),然后我们从多的那一边的没匹配的搜不交增广路,如果把所有点都搜到了就连起来(此时白点都有两个了),然后再跑生成树。搜不到显然寄了。

posted @ 2025-04-05 21:22  dddddadaplllllane  阅读(44)  评论(0)    收藏  举报