2023解题报告(CSP-S后)
2023.10.29
1.sequence
算法:
给定
有长度为
可以发现
2.graph
算法:
给出
-
用处:维护路径最大最小值的树,
-
性质:任意两点的
的点权为其路径的最大/最小值 -
建树方法:按照边权从小到大/从大到小进行生成树,对于原图上的两点
的祖先新建一个点 成为 的祖先,且 点权为 边权。
这道题我们直接以时刻为每条边的边权,当
2023.11.02
1.AOE
算法:
定义
即对一个数轴按块长为
每次加入一个数
考虑离线计算贡献,我们可以先记录下每个数出现的最短时间,再建
最后我们便利询问的时候,每到一个时间点将生效的块在树状数组中记录,最后对于每个询问变为了树状数组区间加操作。
2.stamps
算法: 动态规划dp+单调队列
给出
发现当一个区间被另一个区间覆盖时,选较大的区间不会更劣,所以我们先去除被覆盖的区间。发现没有覆盖关系时以
-
对于与当前区间没有交集的区间,前缀最大和转移
-
对于与当前区间有交集的区间,
越小答案更优,因为交集更少,单调队列转移
答案即为
2023.11.03
1.race
算法:长链剖分
给出一个二叉树,对于
我们发现点的权值在树上是链状出现的,所以可以用长链剖分将链从长到短分离出来,再从大到小赋值即可。
2023.11.04
1.Karma
算法:排序
给
我们先从逆序对数的计算方式入手:假设我们当前选择的字符串中有
消除公共的
按照两两字符串的
2.Desire
算法: 树上差分
给一棵树和若干路径,求选
我们显然可以直接枚举每个点,计算这个点被覆盖的方案数,但也会遇到算重的问题。于是我们可以考虑对于一个点,计算至少有一条路径以这个点为路径最高点的方案数。
假设有
2023.11.06
1.match
算法:图论
给出一个
发现点集只会是一个菊花图或者三元环,菊花图处理入度可以解决,三元环的情况当
2.sort
算法: 主席树+中位数
给一个长度为
function sort(a[1...len(a)]):
if len(a) <= 1 then return a
let pivot = a[ceil(len(a) / 2)]
let al, ag = empty sequence
for i in 1...len(a) do
let cmpcnt = cmpcnt + 1
if a[i] < pivot then append a[i] to al
if a[i] > pivot then append a[i] to ag
return sort(al) + [pivot] + sort(ag)
发现每次的操作相当于在一段值域区间上选择了一个点将区间分为两部分,我们将每个数的下表映射到值域上,每次求下标的中位数并在对应值域中的位置进行分割,主席树维护静态区间中位数即可。
3.count
算法: 数论+杜教筛
给出一个数
发现
但
2023.11.08
1.bracket
算法:括号序列+动态规划dp
给出
可以发现每个括号序列处理后都会剩下形如
2.path
算法: 树链剖分
给出一个
考虑用树链剖分维护区间最大最小值和答案,但发现
struct Tree{
int minn,maxn,ans;
};
因为保证祖先关系,所以我们树链剖分往上跳链时先后顺序是确定的,所以我们按处理标记让左右和并时有一定顺序,即为:
tr[x].ans=max(max(tr[ls].ans,tr[rs].ans),tr[ls].maxn-tr[rs].minn);
tr[x].maxn=max(tr[ls].maxn,tr[rs].maxn);
tr[x].minn=min(tr[ls].minn,tr[rs].minn);
需要注意的是跳链是分段来跳的,而我们记录答案还要手动将每一段链进行合并处理,就能得到最终答案了。
2023.11.10
1.interval
算法:
给出一个序列
可以用
2.score
算法:二维数点
给出一个
对于每个三元组
和 是兄弟关系:
很明显,我们只要从
和 是祖先关系:
我们先讨论
和 是同一个点
我们可以考虑容斥,首先进行全局加,考虑不能经过
在提炼出若干段区间
总时间复杂度
2023.11.12
1.双人博弈
算法:博弈论
给出
考虑最高数量的石子堆为奇数个时先手必胜,而为偶数个时需要后手拿才必胜,所以只需要判断有没有某种石子有奇数堆即可。
2023.11.13
1.insects
算法:计算几何
给出初始坐标
对于反射问题我们可以把镜子按照入射角不断折叠,走直线经过的镜子即为反射的次数,于是我们求出第一次的入射角,算多少个入射角能拼接成
2023.11.14
1.dining
算法:最短路+拓扑序+容斥dp
给出一个
首先因为必须走最短路,所以我们先跑一边最短路,并将所有最短路径的边提出来,这样一来整个图就成为了一个
可以先记录
2.two
算法: 数论+二分
先给出
-
再给出一个二次函数
-
给出
,删除 的所有二次函数
每次操作后需输出二次函数的个数。
因为顶点式二次函数中
3.tree
算法: 树论
给定一个无向的树,可以自由地安排访问邻居节点的顺序,求出这颗树字典序最小的先序遍历。
首先一个显然的贪心思路是求出每棵子树的叶子节点的最小值,因为叶子节点优先访问,然后对于每个点,按最小值从小到大遍历邻居即可。一个很棘手的问题是我们如何找到根节点,如果直接枚举根为
这时候需要发掘一些性质,我们可以先找出一个特殊的点,即为最小的叶子节点,因为最小叶子节点一定第一个被遍历。然后我们可以发现一个规律,当以最小叶子节点为根的树上,我们往下遍历尝试换根时,根换到邻居中子树的最小值最大且大于当前值的点一定不劣,所以实现了
2023.11.15
1.同余方程
算法:树状数组+数论
给出
因为
2.部落冲突
算法:广搜
给出
因为部落的占领具有覆盖关系,所以我们直接倒序处理操作,并且给每个点记录一个扩散值表示扩散到这个点的操作最多还会往外扩散多少个点,因为扩散值是不断递增的,一旦有一个扩散操作比当前点的最大扩散值小时,无论这个操作如何扩散都没有作用。最后每个点最多只会被遍历
3.图上开花
算法:并查集+图论
给出
因为我们可以构造出形似
答案为
答案为
4.防御工事
算法:构造+图论
给出树上每个点到其他所有点的距离之和,需要构造出这样的树。
显然距离和最小的点为树的重心,我们考虑从大到小一步一步往上爬,对于一个深度较低的点
2023.11.17.NOIP
2023.11.19
1.景点游览
算法:cdq分治
小
定义一个非空景点集合
中的景点编号连续,即 若 ,则 。- 从
中任意景点 出发,不能经过若干条道路到达一个景点 。
需求出有多少个非空景点集合
这道题第一眼可能以为需要使用
考虑用
2023.11.20
1.路径大小差
算法:点分治
给出一个带边权的树,求无序二元点对
点分治后,我们需要求的即为:(
显然可以先将
设当前重心为
容斥后即为答案。
2023.11.24
1.mex
算法:并查集+图论
每次给出一个二元组,可以对于每个二元组选择一个数放入可重集
首先有一个维护
这道题每个二元组只能选择一个数,我们考虑将二元组变成一条有向边,只保留入度为奇数的点,最后用并查集维护一下每个连通块的奇偶性即可。
2.slauqe
算法:分类讨论
给出两个只含
考虑两个序列的总和为
2023.12.10
1.a
算法:FFT+NTT
给出两个序列
根据拉格朗日插值法可知,对于一个长度为
考虑如何证明一组
我们聚焦到差分函数的最高次项:
显然结果的最高次数为
最后还需要在
2.b
算法:失配树+拓扑排序
给出一个
因为每条边的价值是
-
如果当前点入度等于
,可以从上个点直接转移 -
如果当前点入度大于
,需要判断所有入边是否来自同一条路径
最后对于每个初始入度为
3.c
算法:状态压缩dp
给出一个
直接枚举所选矩阵很容易算重,所以我们考虑枚举答案。
我们可以枚举一个包含所有朝上棋子的最小矩阵,这个矩阵里的点需要满足:
-
矩阵的最左边和最右边有点
-
矩阵的最上边和最下边有点
-
矩阵的所有点一定都在左上角和右下角的所选矩阵(或左下角和右上角)
我们将这六种情况记录成一个六位二进制数,发现最后选到的点前四位或起来并且后两位与起来为
最后将枚举的大小为
2023.12.11
1.混乱
算法:分块
2.七管荧光灯
算法:博弈论+数位dp
给出三个值域,求有多少组
因为亦或和为
3.字符串
算法:线段树+哈希+并查集启发式合并
有一个字符集为
-
给出一段区间
,表示将 为回文串加入条件 -
询问
和 是否相同或不确定。
这道题初始我们每个点的颜色各不相同,考虑操作一带来的影响,对于
2023.12.14
1.tmp
算法:网格图+树状数组
2.弦论
算法:状压dp+贝尔数
3.原题
算法:概率+期望+二项式定理
有一个初始值为
-
使 -
使 -
使
每次操作完都会输出
给出
求所有
直接推操作后的答案是困难的,所以考虑求每个答案
我们设:
我们考虑如何求
最后通过求和的通项公式可以化简出:
设
接下来我们需要求经过
为方便推导,我们再记
最后就是要求经过
最后只需要考虑每个位置
答案即为
2023.12.17
1.温泉
算法:分块
2.摆放石子
算法:找规律
3.游戏
算法:SG函数
2023.12.21
2.森林
算法:权值线段树
3.队伍
算法:动态规划+FFT
2023.12.24
1.晚霞
算法:分块+虚树
2.矩阵
算法:线性变换+矩阵乘法
3.相似序列
算法:主席树+哈希
2023.12.27
1.冒泡排序
算法:线段树
2.上升序列
算法:NTT
3.地铁换乘
算法:图论+并查集
2023.12.30
1.数字重组
算法:整数拆分
2.摆放鞋子
算法:二分图匹配
3.强连通
算法:缩点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现