小题狂练 (A)

因为无法决定题目叫「Solution Set」「做题纪要」还是「杂题乱写」等等于是起了这样的名字 .

只写想写的题目 .

异或图

\(g_k\) 是至少 \(k\) 个连通块的答案,\(f_k\) 是恰好 \(k\) 个连通块的答案,那么有:

\[g_k=\sum_{i=k}^n{i\brace k}f_i \]

斯特林反演即得:

\[f_k=\sum_{i=k}^n(-1)^{i-k}{i\brack k}g_i \]

欲求即为 \(f_1\) . 那么问题就转为求 \(g_i\) .

考虑直接搜出所有连通块(这里是 Bell 数的搜索量),然后对于块间的点线性基即可 .

最小公倍佩尔数

递推就是:

\[\begin{cases}e(n)=e(n-1)+2\cdot f(n-1)\\f(n)=f(n-1)+e(n-1)\end{cases} \]

根据一些推导可以知道就是 \(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 就是:

\[dp_i=\max_{j\in[i-\operatorname{mlen}(i),i-x]}\{dp_j+i-(j+1)+1,dp_{i-1}\} \]

其中 \(\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\) 中的某位的期望步数,这里可以用概率的倒数来求,概率就是:

\[P(S)=\sum_{S\cap T=\varnothing}p(T)=1-\sum_{T\subseteq\overline S}p(T) \]

这样的东西,高维前缀和就行了 . 时间复杂度 \(\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_{i,j}=\max\{dp_{i-1,j},dp_{i,j-1},dp_{i-1,j-1}+[a_i=b_j]\} \]

将每种 \(dp\) 数组作为一个状态,注意到 \(dp\) 数组的差分是一个 01 串,那么压起来就是 \(2^k\) 个结点了 .

外层令 \(dp_{i,j,k}\) 表示长为 \(i\) 的字符串,处在 DFA 的 \(j\) 结点上,且和 \(\tt NOI\) 的最长公共后缀长度为 \(k\) 的方案数即可转移 .

时间复杂度 \(\Theta(nk2^k)\) .

posted @ 2023-12-07 20:54  Jijidawang  阅读(172)  评论(0编辑  收藏  举报
😅​