2022.9.28 闲话

这次闲话是 CSP-J 题 .

书接上文 .

这次的 CSP-J 题和上次的不同在于这次考虑了 CCF 大纲 /oh/hsh

未特殊说明则时间限制 1s,空间限制 512 MiB .

和真正的 CSP-J 的不同之处在于这个有 ABCDEF 共六道题 .

题目不一定按照难度排序 .

同样的,不保证全为原创,不保证全为非原创 .

A. G-Tri

若一个三角形的三点均为格点,则称其为一个 G-Tri .

给一个 G-Tri,计算满足三点的 x 坐标在 [xL,xR] 内,y 坐标在 [yL,yR] 内且全等于给定三角形的 G-Tri 个数(可以是自己),对 998244353 取模 .

所有坐标的绝对值不大于 109 .


B. More and more maids

一个 Maids' Graph 定义为每个点只在不超过 1 个简单环的图 .

两个点 u,v 之间的路径条数记作 r(u,v) .

给一个 n 个点 m 条边的 Maids' Graph,求满足 r(u,v)=2 的点对个数 .

1n,m5×106 .


C. FF Data Structure

给一棵 n 个点的树 T,每个点 u 有颜色 col(u){0,1} 和权值 val(u) .

对于点 x,y

  • 一次移动定义为从某个点 x 移动到某个点 y,其中 dist(x,y)=1 .
  • 一次 FC 移动当且仅当移动时 col(x)col(y) .

对于一个点对 (u,v)

  • 一次 Far-FC 移动当且仅当 FC 移动时 dist(u,x)<dist(u,y)dist(v,x)<dist(v,y) .
  • 一个 FF-Set 定义为从点 u 出发,经过至多一次 Far-FC 移动可以到达的所有点组成的点集 .

对于一个点 u

  • 一次 Down-FC 移动当且仅当 FC 移动时 depth(y)>depth(x) .
  • 一个 FF-Subtree 定义为从点 u 出发,经过若干次 Down-FC 移动(可以是 0 次)可以到达的所有点组成的点集 .

q 次询问,询问有两种:

  • 1 u v,询问点对 (u,v) 组成的 FF-Set 中所有点的点权和 .
  • 2 u,询问点 u 组成的 FF-Subtree 种所有点的点权和 .

1n,q1.2×106,权值不大于 109 .


D. Dorm

某校新建了 m 栋宿舍楼,假期有 n 天,每天都会有一个学生来入住,第 i 天来的学生会到 ai 号楼入住,由于是假期因此第 i 天这个学生来入住以后整栋楼都会开 party ,会产生等于入住后 ai 号楼的人数单位的噪音 .

忍无可忍的宿管向校领导请示,获得了最多 k 次机会:每次机会可以指定某一天的入住完成后,可以指定一栋楼,把那栋楼已经入住的所有学生全部赶走,也就是把指定的一栋楼的入住人数清零 .

求这 n 天产生噪音的最小总量 .

1n1061m1001k500 .


E. Diaphragm

给一个序列 {an} 和一个序列 {wn},找 1,2,3,,n 的上升子序列使得:

  • a 值上升 .
  • w 值和不小于定值 k .

问方案数 .

1n401ai,wi1091k1011 .


F. And in common

有一个序列 {an}m 个约束,第 k 个为一个三元组 (lk,rk,vk),限制着:

i=lkrkai=vk

其中 表示连续按位与 .

对于每个 i[1,m],问是否存在一个序列 {a},使得前 i 个约束全部成立 .

1n,m105 .


长空白下面是题解 .

A. G-Tri

对于一个三角形我们用一个边平行于坐标轴的极小长方形框住它,这样只需要算出极小长方形内的方案数然后乘一乘即可 .

极小长方形内的方案数考虑每个方案都有 2 种翻折,4 种旋转来达成同构,于是总方案数就是 2×4=8 种 .

问题被解决,可能有 corner case,时间复杂度 Θ(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)=2kk0 如何做?


C. FF Data Structure

为了在 CCF 大纲内这题被变成了只用 DFS,并查集和前缀和的题 .

实际上这是一道语文题,难度并不大,可以看出出题人语文水平堪忧 .

首先把同色连通块缩起来,因为这是 CSP-J 题不能用 Tarjan 算法,所以用并查集实现,O(nα(n)) .

然后 FF-Set 就是一条链以及所有邻接点,FF-Subtree 就是纯纯的子树了 .

定义一个点的重儿子为儿子中子树大小最大的那个,重儿子组成的链称作重链 .

首先我们可以通过两次 DFS 求出重链来,然后再进行一次 DFS 进行节点重标号,若现在处理到结点 u

  • u 还未被标号,则为其标号 .
  • u 是重链头,遍历这条重链,将邻接这条链的结点依次标号 .
  • 先递归重儿子,再递归轻儿子 .

这样就有:

  • 对于重链,除链头外的结点标号连续 .
  • 对于任意结点,其轻儿子标号连续 .
  • 对于以重链头为根的子树,与这条重链邻接的所有结点标号连续 .

于是对于一条重链我们可以在 Θ(1) 的时间复杂度内求出答案(先算出 DFS 序的前缀和),因为走一下轻儿子子树大小至少除以二,所以链上的重链数量是 Θ(logn) 的,于是 1 操作被 Θ(logn) 解决 .

注意到进行节点重标号后子树可能会难做,当然可以用两种重标号方法去处理,但事实上还有一种更优美的做法:注意到一棵子树至多剖分为三个不交区间:重链区间、邻接轻点区间、邻接轻子树区间,于是可以用 Θ(1) 的时间复杂度完成 .

于是整个问题被以 Θ(qlogn) 的时间复杂度解决,可以通过本题 .


D. Dorm

注意到噪音对于每一栋楼是独立的,对于每一栋楼可以算出清空 k 次的情况 下的最小总噪音 noise(i,j).

然后考虑 DP,令 dpi,j 表示前 i 栋楼清空 j 次的最小总噪音,则有转移

dpi,j=mink{dpi1,k+noise(i,jk)}

这样就做完了,时间复杂度 Θ(n+mk2),可以通过 .


E. Diaphragm

一看就很不可做是不是,所以考虑 Meet in the middle .

考虑把一个状态 {s} 分为两半,这样分别只有 20 的量 .

假设左边的和是 sL 最大值是 mL,右边的和是 sR 最小值是 mR .

于是状态合法即他俩能合并当且仅当 sL+sRkmLmR,这非常显然吧 .

分别爆搜,把 mR 相同的合到一起,组内排序,只有 O(n) 种不同的 mR .

显然每次右边合法的是一个后缀,因为排过序了,所以直接二分一下就完了 .

时间复杂度 Θ(2n/2polylog(n)),因为具体的我算不出来,反正能过就对了 .


F. And in common

同题目,以下 依旧表示连续按位与 .

大水题,显然有单调性,可以先二分一下 .

如何判断一个前缀是否满足条件呢?首先对于每个位置 i,我们取包含它的所有位置的限制的或作为 ai,首先可以发现这样一定能满足 i=lkrkai 是对应 vk 的超集 .

然而根据一些非常显然的分析,或就是最优方案,也就是说如果或不行那么就没有方案行 .

于是就变成区间 OR 一个数,询问区间 AND 了,这个可以线段树维护,时间复杂度 Θ(n(log2n+log2m)) .

Bonus:更优解法?

posted @   yspm  阅读(59)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示