1.
我是菜*
看到题目什么都想不出来
然后写的两个老哥的暴力
具体就是用树状数组维护每一位 0/1
查询时取出每一位的 0/1 个数,分情况算贡献
60 倍常数的树状数组怎么你了
1 只老哥的做法如下
\(n\) 只有 \(30\) 直接状压 想不到我就是菜
然后我们只能存下 \(2\) 进制 \(30\) 位
考虑 将一个原串存两个二进制串,一个是每一位是否确定的,一个是每一位是否确定为 1 的
设这两个串为 \(uk\) 和 \(fir\)
如果两个串 $ uk_x $ & $ uk_y $ & (\(fir_x\) ^ \(fir_y\)) 不为 0
说明无解
否则 根据 \(uk\) 或起来的一的位的个数就能判断答案
用发现区间信息可合并,用线段树维护即可
2.
昨天刚写过板子
这不是一样吗
然后 \(qkhm :\) 这题两颗树
我 : ? , 哪里
... 确实两颗
然后卡空间,把泷泷弃掉即可
3.
当我知道她是序列分治的时候,其实已经完了
其实一看这题就想到一只 DP,可以写暴力
考虑跨区间贡献
发现如果用 DP 拼接,就 \(mid\) 处有点问题
那我们相当于是在左边不去边界和右边不取中取最大值
即 \(max(f_l + g_r , f_r + g_l)\)
直接移项 ,序列分治 , 可
4.
P6406 [COCI 2014/2015 #2] Norma
比较模版的序列分治
直接化一下柿子(把和左右端点分别有关的分类),然后前缀和优化
5.
P12624 [ICPC 2025 NAC] Humans vs AI
人机如果要改肯定贪心改最大的
可以列出一个和最大值以及区间和有关的柿子
直接序列分治加动态开点线段树会 T
原因是前缀和值域很大
如果你把柿子化的时候像我一样拆成 \(sum[l ~ mid]\) 和 \(sum[mid ~ r]\) 就会比较难受
因为和每次分治的中点 \(mid\) 有关,较难离散化
难道要提前跑一遍
其实把区间和化成差分的形式就好了
直接离散化,稳过
当然不建议像我这样主要是懒得改柿子了
6.
这题刚开始以为是这题的经验
粘过来改了改
结果WA
手模样例发现端倪,原来有重的
以为很难,想了一会
想到如下做法:
分治,枚举最大值
然后就知道了子序列的长度 = 最大值
指针扫不重的最大右边界,然后判断是否合法即可
码、
7.
在 \(tire\) 上匹配,然后就变成了区间第 \(k\) 小,直接上树套树即可,两只 log
但这题有更好写且复杂度更优的做法
官解
在 \(tire\) 树每个节点维护一颗平衡树
在平衡树里维护这颗子树内的串的信息
众所周知字符串比较是 \(O(n)\) 的
由于串本身不修改
所以我们可以先给串从大到小排序,然后依次赋编号表示大小
然后出现次数我们可以 \(<< 32\) 加到编号上
这样信息就被我们压缩到了 1 个 \(long\) \(long\)
复杂度 \(O(10 \times n log_n)\)
浙公网安备 33010602011771号