Loading

NOIp 考前适应题

可以在 cnblog 中阅读。

题单地址

A CF1494E A-Z Graph

题意

给一个有向图,边权是字母,有三种操作:

  • 添加边 \((u,v,c)\)
  • 删除边 \((u,v)\)
  • 询问是否存在一个长度为 \(k\) 的非简单路径满足 \(v_1 \leftarrow v_k\) 的路径与 \(v_k \leftarrow v_1\) 的路径边权序列相同。

分析

手玩题。顶点数量为偶数的情况容易发现只要有一个二元环就行了。

\[1 \overset{\texttt{a}}{\underset{\texttt{b}}{\rightleftarrows}} 2 \]

容易发现路径 \([1,2,1]\) 满足题设,同样 \([1,2,1,2,1],[1,2,1,2,1,2,1]\) 也都满足题设,这启示我们将所有奇数的询问归位一类。

必要性也很显然,任意满足题设的路径必然至少包含一个二元环。

顶点数量为奇数的情况是类似的,结论是存在一个二元环且环上的相反边字母相同。

判二元环存在性只需要 map 等容器维护所有边就行了。

B CF1469F Power Sockets

题意

有一些已知长度的链,一棵只有一个白色根节点的树。定义一次操作为:

  • 选择用一条未操作的链,连接链上中的某个点 \(u\) 与树上某个白点 \(v\)
  • \(u\)\(v\) 都会变成黑色。

每条链最多操作一次,也可以不操作。最小化根节点到第 \(k\) 近的白点的距离。

分析

题意等价于最小化第 \(k\) 深白点的深度。

贪心地,我们在挂上一条链的时候会选择这条链的中点位置,而且会选择树上深度最浅的点,这显然会使深度最浅。

依然贪心地,我们先会选择较长的链。感性理解:后连的链会基于一个比较深的位置向下延伸,我们希望更深的延伸发生在较早的时间点。

我们需要动态维护树上深度最小的点,而且还要支持加入一条链的每个深度,考虑到链上的点深度连续,这个操作实际上可以表述为区间加,线段树可以实现这一操作。而寻找深度最小的点则可以通过线段树上二分来实现。

为啥线段树的节点不会爆空间?考虑最坏情况:\(2 \times 10^5\) 条链的长度都顶满 \(2 \times 10^5\)。我们先加入一条链,即使后面的链全都挂在初始的这条链上,最大深度也只有 \(4 \times 10^5\),况且这并不是最优方案。

C CF1919E Counting Prefixes

题意

有一个仅由 \(-1,1\) 组成的序列 \(a\),现给出序列 \(a\) 的前缀和数组升序排序后的结果,对合法的 \(a\) 计数。

分析

并没有弄懂这个题。

D CF626E Simple Skewness

题意

定义一个可重集的价值为该集合的平均数减去中位数。给定一个序列 \(a\)。找出价值最大的非空子集。

若集合的大小为偶数,则中位数定义为两个中间元素的平均值。

分析

结论:集合大小为偶数一定劣于奇数。证明可以考虑一段偶数的集合,删掉中位数中较大的,比较删除前后答案。

于是我们可以钦定选出的中位数是什么,这个中位数将原序列划分为一段前缀和一段后缀。要让平均数减去中位数最大,那选取的区间肯定是尽量大,即前缀的后缀和后缀的后缀。平均数显然是单峰的,可以三分出最大的极值点,时间复杂度 \(O(n \log n)\)

E CF1486F Pairs of Paths

题意

给定一棵树,和 \(m\) 条树上的简单路径,对满足以下条件的二元组 \((i,j)\) 计数:

  • \(i \neq j\)
  • \(path_i\)\(path_j\) 只有一个交点。

分析

参考

并没有弄懂这题,但发现了一个比较好玩的 trick。

F CF1530F Bingo

题意

给定一个 \(n \times n\) 的表格,表格中的每个元素有 \(p_{i,j}\) 的概率为 \(1\),否则为 \(0\)

求至少有一行或一列或一条对角线全为 \(1\) 的概率。

分析

对角线不好搞,我们先用 \(2^2\) 次循环枚举对角线状态。这个要容斥掉重复贡献。

对原问题容斥是求有 \(k\) 条行/列/对角线不全为 \(1\) 的概率,这个是不好做的。那我们反过来求原问题的补集,即不存在任何行/列/对角线全为 \(1\) 的概率,这个问题容斥之后是存在 \(k\) 条行/列/对角线全为 \(1\) 的概率。

这个概率的计算可以先钦定一些列必须全选,一些列必须不全选,复杂度爆了。然而枚举钦定行的部分式子等价于在这一行钦定这一行不全为 \(1\) 的概率。于是可以 \(O(n \times 2^n)\) 计算。

G CF1725J Journey

题意

给你一棵带边权树,要求从任意一点出发遍历这棵树,经过每一个节点至少一次(起始点和终止点不必相同)。允许至多一次从一点传送到另一点。问可以走过的最小的总边权。

分析

如果没有传送的条件就是经典题,答案等于边权和的两倍减掉直径长。

考虑扩展这个做法。弱化版的走法是从直径的一段开始沿着直径走,如果有分叉就向分叉走然后回来。本题就是将一条直径扩展成了两条链。

如果选取的这两条链相交,那可以转化为从一个点向下伸出四条链,这个可以换根维护。

如果不相交,此时这两条链必须有两个点相邻,不然就会漏点。而这两个点之间的边一次都不会被经过。我们依靠这两个相邻的点统计答案。

换根的实现非常繁琐。

H CF1485E Move and Swap

题意

给定一棵树,\(1\) 号节点上有一红一蓝两个棋子,红棋子每步只能移动到其儿子节点,蓝棋子每步可以移动到比其深度大一的任何节点。每步的收益是红蓝棋子的权值差的绝对值,最大化最终收益。

分析

DP,记录 \(f(i,j)\) 表示红子在 \(i\),蓝子在 \(j\) 的最大收益,这当然是可以转移的,但已经到三方了,仅仅是状态数就已经爆了。

注意到蓝子可以任意选,那最优的肯定是放在最大或者最小位置,于是可以砍掉记录蓝子的一维,转移也得到优化。

cjx 叫这个双指针单移动模型。与 YT 的平台下降有相似之处。

还有一个拆绝对值的神奇操作:\(|a-b|=\max\left\{a-b,b-a\right\}\)。可以分别维护 \(a+b,a-b\)

posted @ 2024-11-23 16:59  tai_chi  阅读(22)  评论(0)    收藏  举报