小题狂练 (A)
因为无法决定题目叫「Solution Set」「做题纪要」还是「杂题乱写」等等于是起了这样的名字 .
只写想写的题目 .
异或图
令 \(g_k\) 是至少 \(k\) 个连通块的答案,\(f_k\) 是恰好 \(k\) 个连通块的答案,那么有:
斯特林反演即得:
欲求即为 \(f_1\) . 那么问题就转为求 \(g_i\) .
考虑直接搜出所有连通块(这里是 Bell 数的搜索量),然后对于块间的点线性基即可 .
最小公倍佩尔数
递推就是:
根据一些推导可以知道就是 \(f(n)=2\cdot f(n-1)+f(n-2)\) .
根据 SoyTony 第一小定理可以得到 GCD 性质 \(\gcd(f(n),f(m))=f(\gcd(n,m))\) .
那么用 gcd-lcm 容斥就变成要求 \(g(n)=\prod_{T\subseteq S}f(\gcd(T))^{(-1)^{|T|}+1}\),对 gcd 反演后调和级数处理即可 .
时间复杂度 \(\Theta(n\log n)\),如果有人有更优解法欢迎交流 .
ZJOI2015 幻想乡战略游戏
考虑一次操作有什么影响,假设当前答案是 \(u\) . 以 \(u\) 为根考虑,\(\operatorname{sumd}(u)\) 是 \(u\) 子树内的 \(\sum d\),\(v\) 是 \(u\) 的一个儿子 . 简单讨论可以得到改成 \(v\) 更优当且仅当 \(2\cdot\operatorname{sumd}(v)>\operatorname{sumd}(u)\) .
考虑怎么快速跳,在点分树上考虑,每次只需要跳 log 步,然后就行了 .
时间复杂度 \(O(n\log n+q\log^2n\cdot\max\deg(u))\) .
CTSC2012 熟悉的文章
二分答案 \(x\) 后 DP 就是:
其中 \(\operatorname{mlen}(i)\) 表示以 \(i\) 结尾的字符串出现在模板串中的最大长度,这个可以广义 SAM 求出,因为转移是滑动窗口所以可以单调队列优化,这样就是线性对数的复杂度,可以通过 .
巧克力王国
对于每个巧克力看成二维平面的点 \((x,y)\),那么变成查询 \(ax+by<c\) 的元素个数 .
2-D Tree 维护,问题是查询每个矩形内 \(ax+by\) 的最值,根据单调性只在 \(x,y\) 的最值处取到,于是可以天然维护 .
对于这道题目的剪枝是 \(\max\{ax+by\}<c\) 和 \(\min\{ax+by\}\ge c\) 两边分别 bound .
复杂度比较玄学,反正能过(
HEOI2013 ALO
核心问题在于求出每个元素为次大值的区间范围(详细讨论见 2023.12.6 闲话). 从小到大扫依次更新,每次更新完了就删掉对应元素,那么最后只需要在每个元素的左右走一下即可找到对应位置 .
双向链表维护即为线性 . 外面还有一个可持久化 0-1 Trie 的 log .
HAOI2015 按位或
min-max 容斥变成对每个集合 \(S\) 求第一次覆盖 \(S\) 中的某位的期望步数,这里可以用概率的倒数来求,概率就是:
这样的东西,高维前缀和就行了 . 时间复杂度 \(\Theta(n2^n)\) .
ARC132F Takahashi The Strongest
显然 Takahashi 获胜当且仅当 Aoki 和 Snuke 选的相同,先考虑容斥改成算每一次都不绝对赢的方案数 .
FWT 求出来每种组合的全赢方案(需要设计一个位运算)然后再 FWT 就可以求得答案了 . \(\Theta(k4^k)\) .
SHOI2006 有色图
Burnside 引理转成算每种置换的不动点个数,也就是 \(m\) 的等价类个数次方 .
拆成若干个不相交轮换之积后考虑每条边的成分:
- 两端点在同一轮换中:对于一个长为 \(c\) 的轮换,显然两条边本质不同当且仅当它们长度不同,所以共有 \(\left\lfloor\dfrac c2\right\rfloor\) 种 .
- 两端点在不同轮换中:对于长为 \(c_1,c_2\) 的轮换,每个位置转 \(\operatorname{lcm}(c_1,c_2)\) 次就回来了,故共有 \(\dfrac{c_1c_2}{\operatorname{lcm}(c_1,c_2)}\) 种 .
那么枚举 \(n\) 的分拆分别计算即可 . 这里一种方案对应的置换个数可以由多重组合数算出 .
TJOI2018 游园会
dp of dp . 首先考虑内层 DP,相当于要建一个关于 LCS 的 DFA,考虑对于求 \(a,b\) LCS 的经典 DP:\(dp_{i,j}\) 表示 \(a[1:i]\) 和 \(b[1:j]\) 的 LCS 长度,对于固定的 \(a\) 每次转移只需要 \(dp_{i-1}\) 和 \(b\) 数组的一处点值:
将每种 \(dp\) 数组作为一个状态,注意到 \(dp\) 数组的差分是一个 01 串,那么压起来就是 \(2^k\) 个结点了 .
外层令 \(dp_{i,j,k}\) 表示长为 \(i\) 的字符串,处在 DFA 的 \(j\) 结点上,且和 \(\tt NOI\) 的最长公共后缀长度为 \(k\) 的方案数即可转移 .
时间复杂度 \(\Theta(nk2^k)\) .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/17860499.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ