Loading

【考后总结】4 月清北营模拟赛 2

Page Views Count

4.20 胡测 7

我怎么这么菜!我怎么这么菜!我怎么这么菜!

T1 命题

从内到外考虑,设 \(f(i,s1,s2)\) 为当前位置 \(i\)\([i+1,n]\) 部分 \(x\) 取值为 \(s2\)\([1,i]\) 部分每个位置上是全称量词或存在量词取值为 \(s1\) 的情况下命题是否成立,这样 DP 时从 \(i-1\)\(i\) 的转移就是第 \(i\) 的状态由表示取值到表示量词,分别用与运算和或运算转移到全称和存在即可。

复杂度 \(O(n2^n)\)

本题关键是设计状态,赛时一直在考虑如何把取值集合通过卷积之类的操作过渡到量词集合,这样似乎是复杂而困难的。

T2 分组

钦定 \(B\) 先放满,方案数在此基础上乘 \(2\)

枚举放满 \(B\) 的最后位置,容易发现这个位置一定不能是 \(2n\),否则 \(A\) 先放满。在 \(B\) 放满后,后面的人都会被分到 \(A\) 中,因此如果后面有被询问的人,询问集合整体都分到 \(A\) 中,反之则分到两组均可。

由于不同的最后位置的方案数与前缀有多少被询问的人有关,所以考虑枚举被询问的人的个数。写出式子:

\[2\times \dfrac{1}{2^n}\left(\sum_{i=0}^k \sum_{j=p_i+1}^{p_{i+1}-1}2^{2n-j}\dbinom{j-i-1}{n-1}+2^{2n-p_k}\dbinom{p_k-k}{n-k}[p_k<2n]+\sum_{j=p_k+1}^{2n-1} 2^{2n-j}\dbinom{j-k-1}{n-k-1}\right) \]

第一部分是分到 \(A\) 组的方案,实际上就是 \(j\) 后面的位置无关紧要(\(B\) 已经填满,任何结果都会分到 \(A\) 组),前面的结果除了最后一个位置 \(j\) 一定是 \(B\),被询问的位置一定是 \(A\),其余位置中再选出 \(n-1\) 个组成 \(B\)。同时根据当前统计的情况,被询问的位置一定不是最后一个填 \(B\) 的位置。

后面两部分本质相同,是分到 \(B\) 组的方案,与上面的唯一区别是除了最后一个和被询问的以外,其余位置中选出 \(n-k-1\)\(B\)。但比较特殊的是恰好 \(p_k\) 在位置放满,此时有 \(k\) 个位置被钦定而不是 \(k+1\) 个。

考虑化简式子。

把前半部分拿出来处理一下:

\[\begin{aligned} &\sum_{i=0}^k \sum_{j=p_i+1}^{p_{i+1}-1}\dfrac{1}{2^j}\dbinom{j-i-1}{n-1}\\ =&\sum_{i=0}^k \sum_{j=p_i+1}^{p_{i+1}-1}\dfrac{2^{-i}}{2^{j-i}}\dbinom{j-i-1}{n-1}\\ \end{aligned}\]

\(f(x)=\dfrac{1}{2^x}\dbinom{x-1}{n-1}\),则化简成:

\[\begin{aligned} &\sum_{i=0}^k \dfrac{1}{2^i}\sum_{j=p_i+1-i}^{p_{i+1}-1-i} f(j)\\ \end{aligned}\]

这部分可以前缀和 \(O(k)\) 求了。

后半部分实际上是只关于 \(k\) 的前缀和,而由于 \(\sum k\)\(n\) 同级,所以 \(k\) 取值只有 \(O(\sqrt{n})\) 种,可以预处理。

总复杂度 \(O(n\sqrt{n})\)

T3 题目

LIS 容易想到偏序关系,容易想到建有向图。

最朴素的建图是满足 \(i<j,a_i+1=a_j\) 的连 \(j\to i\),满足 \(i<j,a_i=a_j\) 的连 \(i\to j\)

结合样例 \(a=\{1,2,3,3,3,3,2,1,4,1\}\),发现 \(p_6<p_9\) 是必须成立的。

证明:假设 \(p_6>p_9\),则为了保证 \(a_9=4\),一定存在 \(i\) 满足 \(i<9,a_i=3\)\(p_i<p_9\),此时 \(a_i=a_6=3\) 所以 \(p_6<p_i<p_9\),假设不成立。

在此基础上有 \(p_6<p_5<p_4<p_3\),所以 \(p_3,p_4,p_5\) 的取值已然和 \(p_9\) 无关了,也就是一个位置 \(j\) 之和它前面第一个满足 \(a_i+1=a_j\)\(i\) 有限制关系,也就是只连一条边。

现在只要求出能到达一个节点的节点个数,就是其在最好情况下从大到小的排名。为了减少边数,\(a\) 相同的边只连相邻的一条,边数达到 \(2n\)

直接拓扑排序会算重,结合一张图理解一下:

这是按照上面要求建好的图,容易发现 \(9\) 分别直接或是通过 \(12\)\(15\)\(8\) 产生贡献,会重复,而 \(10,12,13\) 也是同样的情况,不如删去这些边,不会影响答案。所以对于一个起点,只连终点最大的一条,在此基础上,对于一个终点,只连起点最大的一条。

如下图:

这样每个节点的入边最多只有两条:同层和跨层各一条。

对于 \(7\) 这种情况,从两条边都转移会有重复,重复部分实际上在 \(7\) 上面层当中,而 \(8\) 恰好统计了这些层中全部答案(结合同层边以及连边只连起点最大的一条不难理解),剩余的节点就是与 \(7\) 同层且更靠前的节点,所以可以只从 \(8\) 转移,再加上同层更靠前的节点数。

对于只有一条边的节点,直接转移即可。

4.21 冲刺清北营 3

T3 最短路

先看图。

如果这是最终的路线,那么返程的路线实际上一定是由不经过 \(1\to n\) 路径的部分和重走 \(1\to n\) 路径的部分交错组成的。

对每段不经过 \(1\to n\) 路径的部分考虑,设起点为 A 类点,终点为 B 类点,那么 \(1\to n\) 路径上除了 \(1,n\) 以外,点的种类是一定形如 BABABA,画图很好理解。

图中 \(4,7,13\) 都是 A 类点,\(3,6,11\) 都是 B 类点。

\(f_{i,j}\) 表示目前处理到的最后两个节点是 \(i\)\(j\) 的最小花费,其中 \(i\) 是 B 类点,\(j\) 是 A 类点,例如 \(f_{3,4}\) 就包括了 \(4\to 1\) 以及 \(1\to 4\) 的花费。向下转移时,我们需要枚举 \(i\) 对应的 A 类点是 \(k\),在答案中加入 \(k\to i\) 的花费,这样就和 \(i\) 有关系的花费都计算完毕,剩下两个 A 类点。故设 \(f_{i,j}\) 表示 \(i,j\) 均是 \(A\) 类点,例如 \(g_{4,7}\),此时我们只差 \(4\to 7\) 的花费没有计算。这中间一定包括一个 \(B\) 类点(除了 \(j=n\) 的特殊情况),同样是枚举这个点 \(k\),此时转移到的恰好就是 \(f_{k,j}\) 了。

初始化将 \(1\) 看做第一个 A 类点,枚举第二个是什么。由于 AA 相邻一定不优,所以转移 \(g\) 时可以不需要判断枚举的 B 类点是否与 \(i,j\) 相同,这样就可以由 \(g_{i,n}\) 加上距离得到 \(g_{n,n}\),最终答案就是 \(g_{n,n}\)

先 Floyd 预处理最短路,再类似 Dijkstra 去转移 \(f\)\(g\)

4.22 冲刺清北营 4

T1 猴戏世家

原题:Luogu-P4737 CERC 2017 Buffalo Barricades

考虑先计算出在每个栅栏围成图形中的猴子个数。正常来说,一个猴子贡献到的栅栏应当是纵坐标横纵坐标均大于它且横坐标最小的一个。但现在存在先后关系,例如 y 本来应该属于 D,而由于 C 更靠前而被 C 包含,注意到这意味着 C 的横坐标大于等于 D 且 C 先出现。

考虑从上向下扫,每次先加入栅栏,用 set 维护横坐标以及出现时间,对于一个猴子,直接查询 set 中第一个横坐标大于它的栅栏,对其产生贡献。像 C,D 这种情况,在加入 C 后暴力删去 D 这样横坐标小于等于它且出现时间晚于它的。

容易证明这样的栅栏一定是连续的,因为如果中间存在一个栅栏不被删去,就说明其出现早于并挡住了当前的栅栏,例如 B 挡住了 C。

这样记录之后,D 的答案就是其本身统计到的答案,而 A 统计到的答案则是 B,C,D 三者共同贡献的。这和出现时间有关系,同时贡献是关于包含关系的,也就是形成了树形结构(C,D 不构成包含关系,因为不论 C 与 D 谁先出现,y 都只会贡献到一个栅栏),而树形结构可以在加入栅栏时查询 set 中第一个横坐标大于等于它的栅栏。

从大到小枚举出现时间,每次向父亲做贡献,并查集维护贡献得到的连通子树,把子树的根作为并查集的根即可。

T2 零糖麦片

原题:CodeForces-468E Permanent *3100

可以视作横坐标和纵坐标二分图连边,一个完美匹配的权值是边权乘积,求所有完美匹配的权值之和。

\(w\) 拆成 \(w-1\)\(1\) 两条边,这样选出任何一个集合 \(S\),都有 \((n-|S|)!\) 种方案,因为剩下的位置必定有权值为 \(1\) 的边。

于是我们只考虑特殊的位置,两侧点共有最多 \(2k\) 个。但如果只考虑一个连通块,\(k\) 条边代表最多有 \(k+1\) 个节点,较少一部的节点只有 \(O(k/2)\) 个,可以对其状压。背包求出不同匹配数量的结果。这样做的复杂度是 \(O(|V|^22^{|V|/2})\) 的,不能通过全部数据。

考虑另一个做法是 DFS 出一棵生成树,暴力枚举非数边的选取情况,在树上跑背包选树边,复杂度是 \(O(|V|^22^{|E|-|V|})\)

合并多个连通块也是背包处理。

注意到第一个做法需要点数较少,第二个做法需要点数较多,平衡一下取 \(|V|=\dfrac{2}{3}k\) 即可,复杂度是 \(O(k^22^{k/3})\)

T3 文体双花

一个经典结论是恰好覆盖等价于 \(\max-\min=r-l\),可以线段树配合单调栈维护最值处理。

DP 的转移显然是对于所有合法的覆盖区间 \([l,r]\)\(dp_{l-1}\) 求和,线段树维护最小值的同时维护最小值对应位置的 \(dp\) 之和即可。

posted @ 2023-04-20 21:59  SoyTony  阅读(52)  评论(0编辑  收藏  举报