2022.9.28 闲话
这次闲话是 CSP-J 题 .
书接上文 .
这次的 CSP-J 题和上次的不同在于这次考虑了 CCF 大纲 /oh/hsh
未特殊说明则时间限制 1s,空间限制 512 MiB .
和真正的 CSP-J 的不同之处在于这个有 ABCDEF 共六道题 .
题目不一定按照难度排序 .
同样的,不保证全为原创,不保证全为非原创 .
A. G-Tri
若一个三角形的三点均为格点,则称其为一个 G-Tri .
给一个 G-Tri,计算满足三点的 \(x\) 坐标在 \([x_{\sf L},x_{\sf R}]\) 内,\(y\) 坐标在 \([y_{\sf L},y_{\sf R}]\) 内且全等于给定三角形的 G-Tri 个数(可以是自己),对 \(998244353\) 取模 .
所有坐标的绝对值不大于 \(10^9\) .
B. More and more maids
一个 Maids' Graph 定义为每个点只在不超过 1 个简单环的图 .
两个点 \(u,v\) 之间的路径条数记作 \(r(u,v)\) .
给一个 \(n\) 个点 \(m\) 条边的 Maids' Graph,求满足 \(r(u,v)=2\) 的点对个数 .
\(1\le n,m\le 5\times 10^6\) .
C. FF Data Structure
给一棵 \(n\) 个点的树 \(\mathcal T\),每个点 \(u\) 有颜色 \(\operatorname{col}(u)\in\{0,1\}\) 和权值 \(\operatorname{val}(u)\) .
对于点 \(x,y\):
- 一次移动定义为从某个点 \(x\) 移动到某个点 \(y\),其中 \(\operatorname{dist}(x,y)=1\) .
- 一次 FC 移动当且仅当移动时 \(\operatorname{col}(x)\neq\operatorname{col}(y)\) .
对于一个点对 \((u,v)\):
- 一次 Far-FC 移动当且仅当 FC 移动时 \(\operatorname{dist}(u,x)<\operatorname{dist}(u,y)\) 且 \(\operatorname{dist}(v,x)<\operatorname{dist}(v,y)\) .
- 一个 FF-Set 定义为从点 \(u\) 出发,经过至多一次 Far-FC 移动可以到达的所有点组成的点集 .
对于一个点 \(u\):
- 一次 Down-FC 移动当且仅当 FC 移动时 \(\operatorname{depth}(y)>\operatorname{depth}(x)\) .
- 一个 FF-Subtree 定义为从点 \(u\) 出发,经过若干次 Down-FC 移动(可以是 0 次)可以到达的所有点组成的点集 .
有 \(q\) 次询问,询问有两种:
1 u v
,询问点对 \((u,v)\) 组成的 FF-Set 中所有点的点权和 .2 u
,询问点 \(u\) 组成的 FF-Subtree 种所有点的点权和 .\(1\le n,q\le 1.2\times 10^6\),权值不大于 \(10^9\) .
D. Dorm
某校新建了 \(m\) 栋宿舍楼,假期有 \(n\) 天,每天都会有一个学生来入住,第 \(i\) 天来的学生会到 \(a_i\) 号楼入住,由于是假期因此第 \(i\) 天这个学生来入住以后整栋楼都会开 party ,会产生等于入住后 \(a_i\) 号楼的人数单位的噪音 .
忍无可忍的宿管向校领导请示,获得了最多 \(k\) 次机会:每次机会可以指定某一天的入住完成后,可以指定一栋楼,把那栋楼已经入住的所有学生全部赶走,也就是把指定的一栋楼的入住人数清零 .
求这 \(n\) 天产生噪音的最小总量 .
\(1\le n\le 10^6\),\(1\le m\le 100\),\(1\le k\le 500\) .
E. Diaphragm
给一个序列 \(\{a_n\}\) 和一个序列 \(\{w_n\}\),找 \(1,2,3,\dots,n\) 的上升子序列使得:
- 其 \(a\) 值上升 .
- 其 \(w\) 值和不小于定值 \(k\) .
问方案数 .
\(1\le n\le 40\),\(1\le a_i,w_i\le 10^9\),\(1\le k\le 10^{11}\) .
F. And in common
有一个序列 \(\{a_n\}\),\(m\) 个约束,第 \(k\) 个为一个三元组 \((l_k,r_k,v_k)\),限制着:
\[\sum_{i=l_k}^{r_k}a_i=v_k \]其中 \(\displaystyle\bm{\sum}\) 表示连续按位与 .
对于每个 \(i\in[1,m]\),问是否存在一个序列 \(\{a\}\),使得前 \(i\) 个约束全部成立 .
\(1\le n,m\le 10^5\) .
长空白下面是题解 .
A. G-Tri
对于一个三角形我们用一个边平行于坐标轴的极小长方形框住它,这样只需要算出极小长方形内的方案数然后乘一乘即可 .
极小长方形内的方案数考虑每个方案都有 \(2\) 种翻折,\(4\) 种旋转来达成同构,于是总方案数就是 \(2\times 4 = 8\) 种 .
问题被解决,可能有 corner case,时间复杂度 \(\Theta(1)\) .
B. More and more maids
根据 Maids' Graph 的特殊性质,进行一次 DFS,将所有环缩成一个方点,原来的点为圆点,这样就构成一个只含圆点和方点的树,并且方点不直接相连 .
\(r(u,v)=2\) 当且仅当 \(u,v\) 在同一个方点内或者 \(u,v\) 所在的圆点间仅隔着一个方点,把圆链缩起来就可以平凡维护 .
时间复杂度 \(O(n+m)\),事实上根据 Maids' Graph 的性质有 \(m=O(n)\),所以也可以说时间复杂度是 \(O(n)\) .
Bonus:\(r(u,v)=2^k\),\(k\ge 0\) 如何做?
C. FF Data Structure
为了在 CCF 大纲内这题被变成了只用 DFS,并查集和前缀和的题 .
实际上这是一道语文题,难度并不大,可以看出出题人语文水平堪忧 .
首先把同色连通块缩起来,因为这是 CSP-J 题不能用 Tarjan 算法,所以用并查集实现,\(O(n\alpha(n))\) .
然后 FF-Set 就是一条链以及所有邻接点,FF-Subtree 就是纯纯的子树了 .
定义一个点的重儿子为儿子中子树大小最大的那个,重儿子组成的链称作重链 .
首先我们可以通过两次 DFS 求出重链来,然后再进行一次 DFS 进行节点重标号,若现在处理到结点 \(u\):
- 若 \(u\) 还未被标号,则为其标号 .
- 若 \(u\) 是重链头,遍历这条重链,将邻接这条链的结点依次标号 .
- 先递归重儿子,再递归轻儿子 .
这样就有:
- 对于重链,除链头外的结点标号连续 .
- 对于任意结点,其轻儿子标号连续 .
- 对于以重链头为根的子树,与这条重链邻接的所有结点标号连续 .
于是对于一条重链我们可以在 \(\Theta(1)\) 的时间复杂度内求出答案(先算出 DFS 序的前缀和),因为走一下轻儿子子树大小至少除以二,所以链上的重链数量是 \(\Theta(\log n)\) 的,于是 1 操作被 \(\Theta(\log n)\) 解决 .
注意到进行节点重标号后子树可能会难做,当然可以用两种重标号方法去处理,但事实上还有一种更优美的做法:注意到一棵子树至多剖分为三个不交区间:重链区间、邻接轻点区间、邻接轻子树区间,于是可以用 \(\Theta(1)\) 的时间复杂度完成 .
于是整个问题被以 \(\Theta(q\log n)\) 的时间复杂度解决,可以通过本题 .
D. Dorm
注意到噪音对于每一栋楼是独立的,对于每一栋楼可以算出清空 \(k\) 次的情况 下的最小总噪音 \(\operatorname{noise}(i,j)\).
然后考虑 DP,令 \(dp_{i,j}\) 表示前 \(i\) 栋楼清空 \(j\) 次的最小总噪音,则有转移
这样就做完了,时间复杂度 \(\Theta(n+mk^2)\),可以通过 .
E. Diaphragm
一看就很不可做是不是,所以考虑 Meet in the middle .
考虑把一个状态 \(\{s\}\) 分为两半,这样分别只有 \(20\) 的量 .
假设左边的和是 \(s_{\sf L}\) 最大值是 \(m_{\sf L}\),右边的和是 \(s_{\sf R}\) 最小值是 \(m_{\sf R}\) .
于是状态合法即他俩能合并当且仅当 \(s_{\sf L}+s_{\sf R}\ge k\) 且 \(m_{\sf L}\le m_{\sf R}\),这非常显然吧 .
分别爆搜,把 \(m_{\sf R}\) 相同的合到一起,组内排序,只有 \(O(n)\) 种不同的 \(m_{\sf R}\) .
显然每次右边合法的是一个后缀,因为排过序了,所以直接二分一下就完了 .
时间复杂度 \(\Theta(2^{n/2}\operatorname{polylog}(n))\),因为具体的我算不出来,反正能过就对了 .
F. And in common
同题目,以下 \(\displaystyle \sum\) 依旧表示连续按位与 .
大水题,显然有单调性,可以先二分一下 .
如何判断一个前缀是否满足条件呢?首先对于每个位置 \(i\),我们取包含它的所有位置的限制的或作为 \(a_i\),首先可以发现这样一定能满足 \(\displaystyle \sum_{i=l_k}^{r_k}a_i\) 是对应 \(v_k\) 的超集 .
然而根据一些非常显然的分析,或就是最优方案,也就是说如果或不行那么就没有方案行 .
于是就变成区间 OR 一个数,询问区间 AND 了,这个可以线段树维护,时间复杂度 \(\Theta(n(\log^2n+\log^2m))\) .
Bonus:更优解法?
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16735950.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ