2022.9.28 闲话
这次闲话是 CSP-J 题 .
书接上文 .
这次的 CSP-J 题和上次的不同在于这次考虑了 CCF 大纲 /oh/hsh
未特殊说明则时间限制 1s,空间限制 512 MiB .
和真正的 CSP-J 的不同之处在于这个有 ABCDEF 共六道题 .
题目不一定按照难度排序 .
同样的,不保证全为原创,不保证全为非原创 .
A. G-Tri
若一个三角形的三点均为格点,则称其为一个 G-Tri .
给一个 G-Tri,计算满足三点的 坐标在 内, 坐标在 内且全等于给定三角形的 G-Tri 个数(可以是自己),对 取模 .
所有坐标的绝对值不大于 .
B. More and more maids
一个 Maids' Graph 定义为每个点只在不超过 1 个简单环的图 .
两个点 之间的路径条数记作 .
给一个 个点 条边的 Maids' Graph,求满足 的点对个数 .
.
C. FF Data Structure
给一棵 个点的树 ,每个点 有颜色 和权值 .
对于点 :
- 一次移动定义为从某个点 移动到某个点 ,其中 .
- 一次 FC 移动当且仅当移动时 .
对于一个点对 :
- 一次 Far-FC 移动当且仅当 FC 移动时 且 .
- 一个 FF-Set 定义为从点 出发,经过至多一次 Far-FC 移动可以到达的所有点组成的点集 .
对于一个点 :
- 一次 Down-FC 移动当且仅当 FC 移动时 .
- 一个 FF-Subtree 定义为从点 出发,经过若干次 Down-FC 移动(可以是 0 次)可以到达的所有点组成的点集 .
有 次询问,询问有两种:
1 u v
,询问点对 组成的 FF-Set 中所有点的点权和 .2 u
,询问点 组成的 FF-Subtree 种所有点的点权和 .,权值不大于 .
D. Dorm
某校新建了 栋宿舍楼,假期有 天,每天都会有一个学生来入住,第 天来的学生会到 号楼入住,由于是假期因此第 天这个学生来入住以后整栋楼都会开 party ,会产生等于入住后 号楼的人数单位的噪音 .
忍无可忍的宿管向校领导请示,获得了最多 次机会:每次机会可以指定某一天的入住完成后,可以指定一栋楼,把那栋楼已经入住的所有学生全部赶走,也就是把指定的一栋楼的入住人数清零 .
求这 天产生噪音的最小总量 .
,, .
E. Diaphragm
给一个序列 和一个序列 ,找 的上升子序列使得:
- 其 值上升 .
- 其 值和不小于定值 .
问方案数 .
,, .
F. And in common
有一个序列 , 个约束,第 个为一个三元组 ,限制着:
其中 表示连续按位与 .
对于每个 ,问是否存在一个序列 ,使得前 个约束全部成立 .
.
长空白下面是题解 .
A. G-Tri
对于一个三角形我们用一个边平行于坐标轴的极小长方形框住它,这样只需要算出极小长方形内的方案数然后乘一乘即可 .
极小长方形内的方案数考虑每个方案都有 种翻折, 种旋转来达成同构,于是总方案数就是 种 .
问题被解决,可能有 corner case,时间复杂度 .
B. More and more maids
根据 Maids' Graph 的特殊性质,进行一次 DFS,将所有环缩成一个方点,原来的点为圆点,这样就构成一个只含圆点和方点的树,并且方点不直接相连 .
当且仅当 在同一个方点内或者 所在的圆点间仅隔着一个方点,把圆链缩起来就可以平凡维护 .
时间复杂度 ,事实上根据 Maids' Graph 的性质有 ,所以也可以说时间复杂度是 .
Bonus:, 如何做?
C. FF Data Structure
为了在 CCF 大纲内这题被变成了只用 DFS,并查集和前缀和的题 .
实际上这是一道语文题,难度并不大,可以看出出题人语文水平堪忧 .
首先把同色连通块缩起来,因为这是 CSP-J 题不能用 Tarjan 算法,所以用并查集实现, .
然后 FF-Set 就是一条链以及所有邻接点,FF-Subtree 就是纯纯的子树了 .
定义一个点的重儿子为儿子中子树大小最大的那个,重儿子组成的链称作重链 .
首先我们可以通过两次 DFS 求出重链来,然后再进行一次 DFS 进行节点重标号,若现在处理到结点 :
- 若 还未被标号,则为其标号 .
- 若 是重链头,遍历这条重链,将邻接这条链的结点依次标号 .
- 先递归重儿子,再递归轻儿子 .
这样就有:
- 对于重链,除链头外的结点标号连续 .
- 对于任意结点,其轻儿子标号连续 .
- 对于以重链头为根的子树,与这条重链邻接的所有结点标号连续 .
于是对于一条重链我们可以在 的时间复杂度内求出答案(先算出 DFS 序的前缀和),因为走一下轻儿子子树大小至少除以二,所以链上的重链数量是 的,于是 1 操作被 解决 .
注意到进行节点重标号后子树可能会难做,当然可以用两种重标号方法去处理,但事实上还有一种更优美的做法:注意到一棵子树至多剖分为三个不交区间:重链区间、邻接轻点区间、邻接轻子树区间,于是可以用 的时间复杂度完成 .
于是整个问题被以 的时间复杂度解决,可以通过本题 .
D. Dorm
注意到噪音对于每一栋楼是独立的,对于每一栋楼可以算出清空 次的情况 下的最小总噪音 .
然后考虑 DP,令 表示前 栋楼清空 次的最小总噪音,则有转移
这样就做完了,时间复杂度 ,可以通过 .
E. Diaphragm
一看就很不可做是不是,所以考虑 Meet in the middle .
考虑把一个状态 分为两半,这样分别只有 的量 .
假设左边的和是 最大值是 ,右边的和是 最小值是 .
于是状态合法即他俩能合并当且仅当 且 ,这非常显然吧 .
分别爆搜,把 相同的合到一起,组内排序,只有 种不同的 .
显然每次右边合法的是一个后缀,因为排过序了,所以直接二分一下就完了 .
时间复杂度 ,因为具体的我算不出来,反正能过就对了 .
F. And in common
同题目,以下 依旧表示连续按位与 .
大水题,显然有单调性,可以先二分一下 .
如何判断一个前缀是否满足条件呢?首先对于每个位置 ,我们取包含它的所有位置的限制的或作为 ,首先可以发现这样一定能满足 是对应 的超集 .
然而根据一些非常显然的分析,或就是最优方案,也就是说如果或不行那么就没有方案行 .
于是就变成区间 OR 一个数,询问区间 AND 了,这个可以线段树维护,时间复杂度 .
Bonus:更优解法?
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16735950.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】