乱做的杂题总结
AT
AGC001E
远古AGC,但题目质量依然很高。
形式化题面:
有
一看上去就感觉是非常经典的拆式子,但我实在是不会拆,最后放弃了。
苦思冥想数十分钟后只会
决定看题解。
题解区分为两大类,生成函数和几何意义
我们不会生成函数最后只能学习几何意义。
首先我们知道,从点
所以我们考虑平移这个矩形,将起点平移到
随随便便打个
但我们发现它会算重,重复在于
AGC002D
依然是远古 AGC,题目质量依然很高!但我们这次没看题解就把它做出来了,哈哈哈哈。
先简单描述一下题意:
给你一颗
额,题意还是一如既往的描述不清,算了,将就着看吧。
首先我们发现其实很多边都是没用的,因为我们可以重复走过一个点,所以真正有用的是这个图的最小生成树上的边,边的权值定义为边的编号即可。
可我们发现只维护最小生成树是没有用的,因为我们依然不知道该怎么最小化这个走过的编号最大的边的编号,然后我们想起了前几天用过的Kruskal 重构树,这个东西就是每次按边权从小到大加进来一条边时,不直接连上这条边,而是新建一个点,将儿子设为这条边连接的两个节点所在重构树的根节点,并将点权设为边权,这样很明显可以发现构成了一颗二叉树的形式。
这样有什么用呢?这个重构树有很多性质,一般都跟两个节点的
这道题我们发现,要最小化最大值,考虑二分。二分出来一个答案
而找祖先我们可以倍增找。
所以总时间复杂度为
第一次自己不看题解做出来了一道AGC的题耶。 \^_^
AGC002E
又是一道想半天不会做的题,但一看题解茅塞顿开。感觉我智力有点问题
先来讲一下题目大意:
有
- 把当前糖数最大的那罐糖全部吃完。
- 从每罐糖中取一颗出来吃。
吃掉最后一颗糖的人输,问谁有必胜策略(先手或后手)。
先一看,博弈论,再一看,可以排完序然后差分,这样两种操作就变成了可以把最前面的数
然后……,然后就卡死了,放弃思考,开始看题解。
题解区的想法十分巧妙,把题目转换为另一个题目来做。
还是要先排序(从大到小),这是我思路唯一和题解一样的地方。
具体来说,就是我们可以对题意做一个转换,在一个网格图上,我们刚开始在点
比如对于序列:
7 5 3 3 1
它画出来长这样:
我们这样就把两种操作分别变为向右走一步或者向上走一步,两人轮流走,走到边界的人输。
我们发现红线上的点都是必胜点,因为走到红线前的上一步的那个人已经取走了最后一颗糖。
那对于红线围起来的点该怎么确定是必胜点还是必败点呢?
我们发现它可以这样转移:对于一个不在边界上的点
最后我们判断点
打一下表我们不难发现,对于对角线上的点,它们的状态都是一样的。
所以我们可以找到最大的正方形的顶点
然后就做完了,这种转化题意的套路第一次见耶!
AGC002F
AGC 继续冲冲冲,今天来做组合计数。
简述题意:
有
我刚开始想的时候是一直在想直接计数,但后来看了数据范围才发现应该不能直接计数,不然怎么会开这么小。
后来转变思路,想 DP,但发现要么不会转移,要么状态数太多。好吧,投降看题解。
题解也是 DP 。我们发现构成一个合法的排列的充要条件是任意前缀的白球个数都大于等于颜色种类数(不包括白色)。我们想到可以设一个状态
我们发现我们直接做的话会算重,所以我们钦定每次处理一种颜色或填一个白球时第一个球一定要填到第一个空位处,这样就不会算重。
好,来列转移方程:
稍微解释一下第二条转移式,先选一种颜色,然后把第一个空位填了,然后用组合数处理填后面的方案数。
特判
一道练习组合计数的好题。
AGC073A
虽然是道A题,但是别笑,笑了你也和我一样只能花一个上午才能写出一个巨难写的做法。
简单描述题意:
给你一个周长为
先写一下我们在赛场上的思考:
先随便画几个图,发现黑色块的数量和弦的位置关系有强相关性(废话)。然后我们注意到每次加入一条弦,黑色块增加的数量似乎和交点数量有关,但是好像还和开头块的颜色也相关,不好计数。我们放弃这条思路。我们接下来想到可以破环成链,我们发现,这个想法很有前途,因为操作被我们传化成了,在一个初始全是
现在来写一下赛后改题思路:
我们发现,一个区域是黑是白取决于包围它的弦的数量的奇偶性。然后我们考虑对这个进行计数。
我们依然先破环成链一下,先暂且不论首尾相邻的问题。我们发现我们可以枚举一个区间
什么?你问我怎么算贡献?我们再统计出有多少个区间右端点在这个区间内,注意,如果一个区间的右端点刚好是第
想直接算,发现不太行,所以换个思路。发现答案就是:
为什么,因为发现上面的那个式子就是方案数乘上贡献,我们把贡献拆到每一步去算,这样就变成了下面那个式子。
我们再在草稿纸把这些组合数拼一拼,就可以发现是可以拼成一个好算的式子的,自己思考去。
然后就做完了。
CF
我们也是开始做了CF的杂题了,好吧!
CF518D
这道题其实是 qbf! 讲的杂题的弱化版,但还是做了我很久。看看什么时候做了那道杂题好吧。
先简述题意:
给你
首先我们发现这不是一道简单的三维偏序板题,因为它让我们计数,并且是三维中只需要两维偏序即可。
我们想到可以先降维,将三维问题降成二维的问题来做。
先在草稿纸上列个二维的表格,第
例如该题的第一个样例在没考虑所有限制时的表格长这样:
5 5 5 5
5 5 5 5
5 5 5 5
5 5 5 5
我们现在将第二个三元组限制
- 首先对于左上角坐标为
(1,1) 到右下角坐标为(1,3) 矩阵里面的点来说,它们的值肯定为零,因为它们无论如何都无法大过这张牌。 - 对于前
1 行,由于题目要求偏序要至少两维,但对于这两行的点来说,它们第一维肯定是偏序不了的了,所以这些点的另外两个元素一定要大过这个限制,第二个元素不用管,第三个元素就只能取5 了,所以这一行的值全部变成1 ,因为只有一种选法。列也同理。
所以表格变成这样:
0 0 0 1
1 1 1 5
1 1 1 5
1 1 1 5
把上述过程推广一下,我们就得到了
但我们发现一个一个点看太浪费了,考虑一行一行统计看来加速计算。
我们设
我们发现第二个操作就是在让一段
这样的话
先不考虑被赋值成
对于第
前一个可以用前缀和,后一个直接算。
求
然后在考虑被赋值成
一道不错的小清新题。
CF2127H
一道 VP 比赛里的最后一题,当时因为 D 题导致心态调崩,没心情也没时间打这道题了。
正解还不会,但我们会偏解。
简单概括题意:
给你一个
我们首先想到一个非常直接的贪心,就是依次加入每一条边,看看加入这条边后是否合法,合法就加入,否则就不加入。
但很显然,它是错的,不然
不难发现当出现一个
通过思考,注意到边的顺序是关乎答案大小的,再加上
具体而言就是用模拟退火,每次随机交换两条边的顺序再跑贪心。
然后就过了,还挺快。
洛谷
没错,还有洛谷。
[KTSC 2022 R1]直方图
还没做出来!!!
[JSOI2018] 战争
在打上面那道题时发现闵可夫斯基和有点不太会,于是决定复习一下,便找到了这道题来练练手。
简单描述题意:
给你一个由
首先得先否定自己脑袋里那个将图形
我们考虑对于一个询问
就是满足如下条件:
写得不那么严谨一点就是:
这和属于号右边和询问无关啦!
所以我们可以用闵可夫斯基和维护出这个所谓的
所谓的
但我并不会直接维护凸包,且我也不知道怎么判断一个向量是否在一个凸包内,于是我用了一点人类智慧。
分别维护上凸包和下凸包,然后
最后来细说一下闵可夫斯基和,就以合并上凸包为例。
可以证明两个上凸包合并后形成的上凸包边数为原本两个凸包的边数之和,换句话说就是新的凸包的每条边都是原本两个凸包的边,所以我们可以类似归并排序,把两个凸包的边按斜率排序,再算一下左下角那个点坐标,这样一整个凸包就确定了,线性时间复杂度,十分优秀!
数列分块系列
洛谷也有,题目名称相同,自己搜,难度不高。
在这个系列里,你将见识到分块文化的博大精神,什么数据结构的板题都能做。进可考场切黑题,退可无脑骗高分,真可谓是灵活通用的算法,算是必学数据结构之一。
数列分块入门 1
水题,线段树秒了
为了 尊重作者 锻炼分块的能力,我们还是来打一下分块吧。
简单描述题面:
给出一个长为
真的没什么好讲的,把数列分成
数列分块入门 2
本人认为这是分块入门的第一道坎。
简单描述题意:
给出一个长为
这个的难度略大于上一题,首先查询元素个数,我们自然而然想到的就是桶,然后小于等于
但是
聪明的你一定想到了,可以离散化+二分,详细来说就是把块内的元素排序,然后每次查询就是散块暴力查,整块二分查就行了。
那修改怎么办呢?一样的,我们发现如果修改的范围包括了一整个块,那么块内元素相对大小不会改变,所以就直接维护一个加法标记即可,散块也是直接暴力修改,然后暴力排序即可。
时间复杂度大概是
数列分块入门 3
简单描述题意:
给出一个长为
其实和上面那道题一样,改几个 byte 就可以了,不多啰嗦。
数列分块入门 4
又是一道线段树板题。
简单描述题面:
在长度为
同数列分块入门 1,就不多啰嗦了。
数列分块入门 5
暴力题。
简单描述题意:
给出一个长为
注意到一个数顶多开 15 次平方就会变成 1 ,而变成 1 后就不会再变小了,所以我们依然分块。对于每个块我们维护不是
数列分块入门 6
一道块状链表的板题。
简单描述题意:
给出一个长为
要支持快速插入。很明显,不是平衡树就是链表,在这里笔者打的是块状链表。
块状链表就是在链表上分块,我们知道链表是不支持随机访问的,一个个跳时间复杂度将会达到惊人的
所以我们考虑分块,将
这样查询就可以做到
那插入呢?我们发现有可能经过不断插入,一条链表的长度可能很长,所以为了保证暴力的时间复杂度是对的,当一个链表很长时,我们就要从中间断开,分成一个新链表,这样插入时间复杂度也可以做到
记得维护一下元素在该块链表里的编号,方便分裂。
数列分块入门 7
不是,怎么这么喜欢用分块做线段树的板题啊!!!
简单描述题面:
给出一个长为
真的不想多说什么,对于每个块维护一个加法标记,一个乘法标记即可。
数列分块入门 8
珂朵莉树的题,分块也能做!!!
简单描述题面:
给出一个长为
我们注意到每对一个整块进行一次操作,这整个块就会被推平,全部变成一个数。所以随着操作数量不断增多,原数列的数的种类一定会越来越少。所以对于散块,我们暴力查询,对于没有被推平的整块,我们也暴力查询,而被推平的整块,我们直接算就行了。
数列分块入门 9
这几道题里面最难的题,你要是能独立思考出来,你就可以算是分块入门了。
简单描述题面:
给出一个长为
很好,我们乍一看似乎没有思路,因为查询区间众数并没有一个好办法。我们最暴力的想法很明显是离散化后看看哪个数最多,但这个似乎不能加上分块优化,那该怎么办呢?
我们想不到做法,但看题目名称我们知道肯定是分块。所以我们可以先把数列的块给分了。把原数列分成一个个块。那我们有个很显然的想法就是我们维护出块中的的众数,然后我们猜测答案肯定是这些数中的一个,然后我们一个一个用
但很遗憾,这样并不对。因为区间众数这个信息并不能合并,就比如每个块的众数个数为
具体来说,就是我们求出一个
但是我们还有散块呢!这个好办,我们直接暴力枚举散块里的数,然后求出它在这个区间里的个数,看看是否能成为答案即可。
但这次我们不能再暴力遍历整个区间了,我们得优化一下。简单来说就是求出一个
这样我们就完成了这道题,时间复杂度
考虑双倍经验 [Violet] 蒲公英。
[CEOI 2021]Newspapers
2021CHD 讲的杂题,一道十分有趣的构造博弈论题。
我们先来简述一下题意:
有一张
- 玩家
A 猜测玩家B 在哪个节点,如果猜到了就游戏结束,玩家A 获胜。 - 如果没有猜到的话,玩家
B 将会沿着与该节点连接的某条边移动到另外一个节点。
求玩家
毕竟是道黑题,我们放个提示吧!
什么,你居然想到了?那我们再给你个提示。
那我们现在来讲一下正解。首先我们考虑一下有解的充要条件,我们发现如果出现了一个环的话,一定无解,因为这个游戏本质上就是通过一次次猜测排除玩家
但其实并不是只要图为一颗树就有解,如右图:
我们这里给出树有解的充要条件:如果存在一个点存在三个深度大于
具体证明就是假设我们已经排除了上图的一个子树,我们接下来应该怎么办。我们手玩一下就会发现我们无论如何都要么会使得玩家
好的,现在剩下的情况就只剩下有解的了,要求我们构造一组最下猜测次数的策略,我们先考虑链怎么做。思考
接下来我们考虑正常的树怎么做,既然上面那个方案是最小的,那么我们很自然的可以想到可以把直径拿出来跑这个,但是可能还挂了些别的,怎么办呢?大佬 2021CHD 给出解决方案:
- 如果一颗子树的深度小于
2 我们就不用管它,因为如果玩家B 在某次操作中躲进去了,由于我们是扫两次,所以一定在某次扫的时候就可以刚好在它出来的时候抓住他。 - 如果一颗子树的深度等于
2 时就不一样了,因为它可以一直躲在里面。所以我们可以类似上面的操作,每次扫到这个点父亲的时候往下猜一个点,具体而言,假如说我们本来猜测序列是这个:x\rightarrow y \rightarrow z ,然后y 这个点有一颗深度为2 的子树,子树的根为c 。那我们可以把猜测序列改为x\rightarrow y \rightarrow c\rightarrow y\rightarrow z 。至于为什么要再猜一遍y 是因为怕玩家B 在我们猜c 这个节点的时候走回节点y 。容易证明这样是最优的。
然后就完结撒花啦!
[CTS2025] 士兵
随机跳题跳的题,发现居然是
奋战近
先简述一下题意:
有从左到右依次排开的
注意!!!贡献可以是负的。
首先拿到这道题的第一个想法是贪心,本来想的是反悔贪心,但是不会贪。所以换个思路,想
关键是这道题还没题解!---------2025.10.15
还好我们有场切的大巨在此,可以让我们求助。
首先正解确实是
先来考虑假如说我们知道每个位置打多少伤害该怎么最小化打伤害的贡献。
我们设
所以我们设
枚举上一个位置的伤害量
时间复杂度
其实这个式子很有前途。
我们发现第一维其实没什么实际作用,所以滚掉。
我们又发现我们任意时刻其实都可以将任意一个数改成后缀
我们不考虑转移式的前面一部分,我们只考虑后面的额外贡献。这一部分其实相当于给一段后缀加上一个数。所以我们按
- 如果
b 是非负的,我们就不用算前面一部分了。因为前面那部分的转移一定不优于原来的,干脆直接由之前的继承过来。记得后缀max 一下。 - 如果
b 是负的,这个时候我们又又发现其实就是f 数组的一段后缀变小了,相当于整体往下平移一些。这个时候我们通过简单证明可以得出,从f_{a_i-1} 处转移一定是最优的。所以操作又变成了让一段后缀与一段等差数列取max 。
综上所述,我们又又又发现,这些操作都可以用线段树快速维护。
最后时间复杂度离散化后是
如果你要离散化那你要注意,真正有效的位置不止那
[集训队互测 2011] Crash 的文明世界
这道题是在刚讲Stirling数时去做的,还不错,不是很难,奋战一会就搞出来了。
先来简述题意:
给定一颗
其中
首先我们先来简单介绍一下第二类斯特林数的定义。
定义:
根据组合意义,我们有如下递推式:
还是简单说明一下吧,前面一项表示对于新的一个球,我们放进前面某个集合的方案数,后面一项表示新开一个集合的方案数。
边界条件是
还有通项公式:
证明先咕着,本道题还用不到。
这些其实不是重点,重点是自然数幂与第二类斯特林数的关系。
我们有如下等式:
我们可以用组合意义证明一下。