Akane-Weekly #6 (杂题)

Akane Weekly #6 (noip 难度杂题)

更新中 \(\dots\)

1.CF484C

考虑有一个长度为 \(k\) 的滑动窗口,相当于每一次对窗口内做一次操作。操作是按照余数重排序,我们 \(O(k)\) 时间可以解决,所以暴力的时间复杂度为 \(O(kn)\)

窗口移动很难维护,我们把窗口固定,改成移动字符串,那么窗口有移变成了字符串左移。

这两种操作都是排列的置换操作,根据置换的结合律,设左移是置换 \(l\)\(d-sort\) 是置换 \(p\) ,那么答案为可以用快速幂求解。

最后记得把排列移回来。

时间复杂度 \(O(n \log n)\)

2.CF1468M

简单根号分治。

\(m=\sum k_i\)

选择按照序列长度分治,设一个长度阈值 \(B\) ,则长度长于 \(B\) 的只有至多 \(m/B\) 条。

这一种,我们可以给每一个元素打标记,然后扫整个字典进行匹配。(也是最直接的暴力),复杂度 \(O(m^2/B)\)

再找一种基于 \(B\) 的做法平衡时间复杂度。

考虑剩下的长度小于 \(B\) 的序列,我们可以直接枚举二元组 \(i,j\) ,并记录其属于第几个集合,然后遍历寻找答案即可,每一个集合复杂度 \(O(B^2)\) ,总复杂度至多为 \(O(n B^2)=O(mB)\)

我们取 \(B=\sqrt m\) 即可。

不卡常。

3.CF1473E

一眼题。

转化条件为选一条边两倍贡献,一条边免费(弱化了条件,但根据贪心,最小值一样,因为同号)。

直接拆四个点跑 \(dijkstra\) 即可。

我用优先队列过不去,换了 \(set\) 就一遍过了,真是神奇。

4.CF1264D2

有套路的组合数题目,不过我第一次做这类题目。

发现我们最终有用的括号序列一定是 \((((\dots)))\) 这样子的,不然可以删掉。

假设问号填好了,考虑怎么找到分界点,分别对左括号个数做前缀和 \(f\),右括号个数做后缀和 \(g\),设分界点为 \(x\) ,则当前方案的答案为:

\(\min(f_x,g_x)\)\(g_x\) 表示 \([x+1,n]\) 的右括号个数)。

有式子 \(g_x-f_x=g_0-x\)

由于 \(f\) 单增, \(g\) 单减,所以当 \(g_x-f_x=0\)\(min(f_x,g_x)\) 最大。此时需要满足 \(x=g_0\)

所以我们同时枚举 \(x\)\(g_0\)

\([1,x]\) 里已经有 \(a\) 个右括号,\([x+1,n]\) 里已经有 \(b\) 个右括号,那么我们还要填入 \(m=(x-a-b)\) 个右括号。

\([1,x]\) 中有 \(c\) 个问号,\([x+1,n]\) 中有 \(d\) 个问号,那么贡献为:

\[\sum_{i=0}^{m} \tbinom{c}{i} \tbinom{d}{m-i} (b+m-i) \]

此时用暴力解决,时间复杂度 \(O(n^2)\) ,可以通过子问题 \(D1\)

我们用范德蒙德卷积来化简这个式子,有如下推导:

\[\begin{equation} \begin{aligned} \sum_{i=0}^{m} \tbinom{c}{i} \tbinom{d}{m-i} (b+m-i) &=\sum_{i=0}^{m} b\tbinom{c}{i} \tbinom{d}{m-i}+\sum_{i=0}^{m} \tbinom{c}{i} \tbinom{d}{m-i} (m-i) \\ &=b\tbinom{c+d}{m} +\sum_{i=0}^{m} \tbinom{c}{i} \tbinom{d-1}{m-i-1}d\\ &=b\tbinom{c+d}{m} +\sum_{(i-1)=-1}^{m-1} \tbinom{c}{(i-1)+1} \tbinom{d-1}{m-2-(i-1)}d\\ &=b\tbinom{c+d}{m} +\tbinom{c+d-1}{(m-2)+1}d\\ &=b\tbinom{c+d}{m} +d\tbinom{c+d-1}{m-1} \end{aligned} \end{equation} \]

预处理组合数即可以在线性时间复杂度内完成本题。

5.NOI-SG 2019 T3

搞一个贪心,每次选一个最大子段和 \([l,r]\) ,把区间分成三段 \([1,l-1] ,[l,r] ,[r+1,n]\) ,我们可以继续在左右两个区间内选最大,也可以在中间的区间把最小子段和的一段反悔掉。

所以我们用优先队列每次选权值最大的一段进行扩展,如果当前段选的是最大子段和就如上操作,如果是最小子段和就再选一段最大子段和反悔回来,总共进行 \(k\) 次。

线段树预处理区间最大最小子段和即可。

6.CF1679F

把所有能够相互转换的归为一个等价类,那么题目要求有多少种不同的等价类。

考虑枚举每一个等价类里面最小的,那么相当于对于一个连续可以互换的区间,必须是单调不降的,可以用一个状压 \(dp\) 来解决。

\(dp_{s,i}\) 表示禁止选的状态是 \(s\) ,当前位置选择 \(i\) 的最小方案即可。

时间复杂度 \(O(n 2^{10}\times 10)\)

7.P3513

原图是 DAG ,先做一个拓扑排序,多个顶点不太好维护最长路,我们搞一个超级源点和汇点,然后做 \(f_i,g_i\) 表示 \(S\)\(i\) ,$i $ 到 \(T\) 的最长路,我们按照拓扑排序把点重新编号,如果我们不选一个点 \(i\) ,那么我们肯定在最长路肯定会选一条边 \((x,y)\) 满足 \(x<i<y\) 。那么我们枚举这条边,则区间 \([x+1,y-1]\) 内的点的答案都要和 \(f_x+g_y-1\)\(\max\) ,还要没有这种边的情况下的情况,最长路为两个连通块的最大值的 \(\max\)\(\max(f_{i-1},g_{i+1})\)

用线段树维护,时间复杂度 \(O(m+m\log n)\)

8.CF802O

显然是费用流模型,打表可以发现答案的上凸性质,我们可以用 \(wps\) 二分解决。

考虑二分枚举惩罚 \(mid\) ,对于这个子问题,我们可以贪心地去取当前最小的,当然,后面也可以反悔回来重新做,还是用优先队列维护即可。

双倍经验: P4694。

9.P4383

典中典。

先写一个暴力的树形 \(dp\)

考虑用树形 \(DP\) 维护每一个连通块,但发现不太好考虑直径的的性质,我们考虑直接维护直径,也就是 \(K+1\) 条不交的链

\(dp[u][i][0/1/2]\) 表示从子树 \(u\) 内选了 \(i\) 条链,不在链上/是端点/是中间点,转移不难。

猜到答案的上凸性,直接 \(wps\) 二分即可。记得边界不能太大。可以设置为 \(val\) 绝对值之和 。

时间复杂度 \(O(n\log W)\)


posted @ 2023-10-08 23:24  ArizonaYYDS  阅读(40)  评论(0)    收藏  举报