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\) .


长空白下面是题解 .

\[\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px}\\\kern{1px} \]

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\) 次的最小总噪音,则有转移

\[dp_{i,j}=\min_k\{dp_{i-1,k}+\operatorname{noise}(i,j-k)\} \]

这样就做完了,时间复杂度 \(\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:更优解法?

posted @ 2022-09-28 19:19  Jijidawang  阅读(54)  评论(1编辑  收藏  举报
😅​