2015 省选乱做

* 表示质量不错的题。

BJOI

简评:隐身术比较高质量,其他的,要么板要么没人过。

树的同构

板子题,没啥好说的。

骑士的旅行

第一个操作就一区间前 \(K\) 大,这类树上问题可以两种考虑,一种是主席树上树,另一种是线段树树剖套 multiset 合并。

本题采用后者最佳,因为前者是静态的,不好修改,那么二三操作都是板子了。

*隐身术

考虑枚举 \(B\) 的子串的开头为 \(j\),记一个状态 \(f(i,j,k)\) 表示 \(A\) 匹配到 \(i\)\(B\) 匹配到 \(j\),还有 \(k\) 次编辑的机会。

注意到每一个位置肯定是能匹配就匹配的,这就需要我们预处理出,\(A\) 的某个后缀和 \(B\) 的某个后缀的 LCP,这个东西可以把两个串连起来一波 SA 带走。

剩余的转移需要考虑编辑,注意到我们可以先将在 \(B\) 删除改为在 \(A\) 添加,则此时有 \(f(i,j,k) \to f(i+1,j+1,k-1),f(i,j+1,k-1),f(i+1,j,k-1)\)

注意到到匹配完的时候仍然有删除 \(B\) 的最后一位,即往右移一手 \(B\) 目前对应的子串,那么 \(f(i,j,k)\to f(i,j-1,k-1)\),这样可以多记录下一些答案。

时间复杂度上界是 \(O(n\log n+n4^k)\),但是根本跑不满。

回家的路

没人过,不做。

糖果

记长度为 \(m\),值域为 \([1,k]\) 的不降序列个数为 \(f_{m,k}\),则答案显然为 \(A_{f(m,k)}^n\)

\(f(m,k)\) 可以看成,先选定 \([1,k]\) 中所有数各出现若干次(记 \(i\) 出现 \(x_i\) 次),那么需要求出 \(\sum_{i=1}^k x_i=m\),且 \(x_i\ge 0\),的解的个数。

这是一个经典的组合数问题,显然答案就是 \(\binom{m+k-1}{k}\)

求某组合数对 \(p\) 的取模答案是简单的,至于排列数,求出取模的结果之后,是简单的。

CQOI

简评:两典,一个傻逼高精,一个构式 DP,有点意思的就是选数,可惜我之前写过了。

任务查询系统

典题,不写了。

多项式

出题人 byd。

将左式写成 \((x-t+t)^k\) 并用二项式定理展开:

\[\begin{aligned} \sum^n_{k=0}a_k(x-t+t)^k & =\sum^n_{k=0} b_k (x-t)^k \\ \sum^n_{k=0}a_k\sum_{i=0}^k (x-t)^it^{k-i}\binom{k}{i} & =\sum^n_{k=0} b_k (x-t)^k \\ \sum^n_{i=0}(x-t)^i\sum_{k=i}^n a_k t^{k-i}\binom{k}{i} & =\sum^n_{k=0} b_k (x-t)^k \\ \sum_{k=i}^n a_k t^{k-i}\binom{k}{i} & =b_i \end{aligned} \]

单点求 \(a_k\) 想怎么做怎么做(循环节、矩快),求 \(b_m\) 就直接暴力求左边那个式子复杂度就是对的,因为 \(n-m\le 5\),但是傻逼出题人整了个 \(n=10^{3000}\),所以要写高精度,所以狗都不写。

标识设计

出题人 byd*2。

有好几个做法,这里写一个最好写的。

\(f_{i,p1,p2,p3,k}\) 表示现在第 \(i\) 行,在第 \(p_1,p_2,p_3\) 列的 L 会向下延伸,一共已经填了 \(k\) 个 L。

注意到每一列的 L 共有三种决策,新开,向下延伸,向左解决掉,所以一共有 \(3^3+3^2+3+1\)\(40\) 种决策,全部写上就行了。

时间复杂度 \(O(nm^3)\)

网络吞吐量

典题,建出最短路 DAG,那么最优策略一定会经过这些边,直接拆点跑网络流就行了,不写了。

*选数

之前做过,又推了一遍,就不写了。

FJOI

*世界树

这个高精题比 CQ 的牛逼多了。

记深度为 \(i\) 的这种树至少有 \(f_i\) 个节点,那么 \(f_i=f_{i-1}+f_{i-2}+1\),这个东西增长率和斐波那契数列同级。

猜测一手对于 \(n\in[f_i,f_{i+1})\),答案应该和 \(f_i\) 对应相同,而 \(f_i\) 对应的答案是好计算的。

但是 \(n=6\) 会挂,因为这个时候会被迫加叶子所以答案会变成 \(0\),就只有这一种特例。

对询问排序然后跑一遍斐波那契就行了,有高精不写。

带子串包含约束 LCS 问题

裸题。记录 \(f_{i,j,k,S}\) 表示目前在 \(X\) 的第 \(i\) 位,在 \(Y\) 的第 \(j\) 位,对于约束集对应的 AC 自动机此时跑到了节点 \(k\)\(S\) 集合内的约束串已满足。

使用子序列自动机快速跳 \(i,j\) 两个指针,状态数看起来要开 \(nm2^k\sum l_i\) 会寄,但是因为有状态是没有用的,所以理论能过。

火星商店问题

最小覆盖双圆问题

*金币换位问题

牛逼题,虽然做过 WF2014 那个但还是不会。

核心思路是划归子问题,定义 \(i[j]\) 表示 \(i\) 重复 \(j\) 次,我们称一个子问题形如:\(1[n]0[n-2]\_\_00\)

\[\begin{aligned} 1[n]0[n-2]\_\_00 & \to\\ 1\_\_11[n-4]0[n-2]1100 & \to\\ 1001(1[n-4]0[n-6]\_\_00)1100 & \end{aligned} \]

括号内的形成一个新的子问题,可以递归处理。

称每一个子问题的终止态为 \((10)[x]\_\_(10)[y]\),也就是一堆 \(10\) 中间空了一个。

\[\begin{aligned} 1001(10)[x]\_\_(10)[y]1100 & \to\\ 1001(10)[n-3]1\_\_0 & \to\\ 10\_\_(10)[n-1] & \to\\ \end{aligned} \]

这样就回到了终止态。

\(n\le 6\) 的时候仍然有边界,需要自行暴力枚举解决,此处按下不表。

HAOI

HEOI

HNOI

*亚瑟王

好题。

显然每个技能要分开来算,记 \(g_i\) 表示第 \(i\) 个技能最终被选到的概率,那么答案就是 \(\sum g_id_i\)

想要处理 \(g_i\) 比较困难,不妨考虑加一维,则记 \(f_{i,j}\) 表示前 \(i\) 个选了 \(j\) 个的总概率,则 \(f_{i,j}\) 可以递推,而 \(g_i\) 可以由 \(f_{i,j}\) 递推出来:

\[\begin{aligned} f_{i,j} &= (1-p_i)^{r-j}f_{i-1,j}+(1-(1-p_i)^{r-j+1})f_{i-1,j-1}\\ g_i &=\sum_{j} f_{i-1,j}(1-(1-p_i)^{r-j}) \end{aligned} \]

预处理 \((1-p_i)\) 的若干次幂,\(O(Tnr)\)

JLOI

JSOI

SCOI

SDOI

SHOI

TJOI

ZJOI

posted @ 2023-07-16 15:44  cnyz  阅读(15)  评论(0编辑  收藏  举报