感觉这次的题单非常之牛啊!
CF1153F. Serval and Bonus Problem
题意
现在有一条长度为
再给定一个数字
题解
应该算是套路题。
考虑这题的点是在实数域上随机,不妨假设没有任何两点坐标相同。
然后我们可以只考虑这
设
考虑其中的第
时间复杂度
提交记录。
CF1097F. Alex and a TV Show
题意
现在有
- 令多重集
。 - 令
,此处多重集的并为每一个数字出现次数相加。 - 令
,其中 定义为 。 - 查询
中 的出现次数,输出其 的结果。
题解
对于一个可重集
首先考虑如何快速计算
那么我们令
由于我们只需要维护出现次数
对于一操作,我们可以预处理出单个元素经过正变换之后长什么样子,然后直接赋值就 ok。
对于二操作,相当于两个集合出现次数直接相加,那么就是两个 bitset 异或一下。
对于三操作,就是两个 bitset 按位乘起来,相当于直接 and 一下。
对于四操作,也可以提前预处理每一个位置逆变换之后,和哪些位置有关,然后直接 and 一下再 count 一下就好了。
时间复杂度
提交记录。
CF1205E. Expected Value Again
题意
对于一个字符串
给定
题解
不难发现,一个串有长为
设
前半部分好算,相当于是对于每一个
对于第二部分,相当于是需要计算对于
考虑将每一个位置看成一个点,对相同的位置进行连边,那么方案数相当于是
那么先把所有长度为
连的边里面,一定是恰好最前面
也就是说我们需要计算
考虑枚举
注意到一定有
设
提交记录。
CF1292F. Nora's Toy Boxes
题意
现在有
现在可以进行若干次操作,每一次选定三个不同的下标
求有多少种方案,删掉的数字最多。
两个方案相同当且仅当删除数字的顺序相同,与
题解
首先考虑最多可以删除多少个数字。
首先建一张图出来,如果
还是很难考虑最多可以删掉多少个数字,不妨倒过来考虑,我们计算初始最少可以有多少个数字,然后通过操作,添加数字,变成给定的集合。
首先连通块之间是独立的,所以我们不妨假设整张图连通,设
设
对于
那么我们来证明,只要初始的时候
首先容易发现,对于
那么将
此时若存在一个点
否则所有的
这样我们就证明了此时一定能进行一次操作,所以只要初始的时候
这样我们就求出了最大的删除点的次数,我们还剩方案数需要求。
一个暴力的 dp 是这样的,设
显然,这个东西复杂度很大,完全过不了。
考虑变一下状态,设
这个玩意看起来就好离谱,但是他是可以转移并且算出答案的,考虑一下两种转移:
加入一个点
,这个点的在 中的入边 满足 且 。 显然我们知道,当前可以把
这个点加进去,并且显然 这个点之前并不存在。 那么我们直接可以进行转移
。 加入一个点
,这个点在 中的入边 满足 。 如果这个点
之前不存在的话,显然我们可以通过一次操作将这个点加入集合,有转移 。 但是问题在于,我们并没有记录当前有哪些点存在,我们无法判断
当前是否存在。 这里就是这题喵的地方了,我们不考虑一个具体的点
能否被加入,我们考虑当前总共有多少个点可以被加入。 由于我们现在知道
,所以我们直接就能知道,当前有多少个点是下一次操作能直接加进去的,我们直接随便挑一个点转移即可。
考虑时间复杂度,为
提交记录。
CF1085G. Beautiful Matrix
题意
我们称一个
- 这个矩阵的每一行都构成了一个
的排列; - 对于
,有 。
给定一个好的矩阵,求有多少个好的矩阵字典序比他小。
题解
先考虑有没有什么复杂度稍微高一点的做法。
先枚举
方案数分为两部分,第一部分是第
不难发现,第二部分直接就是错排,第一部分剩下的东西也是一个类似于错排的东西。
设
这个感觉其实就是错排的
那么这样我们就得到了一个
若
,则后面填的数字没有任何限制,答案直接是阶乘。否则,设
为数字 在第 行的出现位置。若
填了数字 ,那么一共只有 和 两种情况。设
,那么显然后续的方案数为 。
树状数组维护一下,就能做到
提交记录。
CF708E. Student's Camp
题意
现在有一个
每一天早上,如果这一行还有至少一个格子,那么这一行的第一个格子有
每一天晚上,如果这一行还有至少一个格子,那么这一行的最后一个格子有
求
题解
首先容易发现每一行剩余的部分是一段完整的区间。
其次我们可以知道,对于每一行来说,其左端点的位置和右端点的位置是独立的。
那么考虑如何进行计数,考虑对于一种合法的方案,我们将其对应到唯一的一条从第一行走到最后一行的路径上。
设计如下的策略:每一次能往下走就往下走,如果不能往下走就往左/往右走到第一个能往下走的位置然后往下走。
不难发现,一个合法的网格一定能够通过这个策略走出一条路径。
考虑这么一件事情,如果我们再某一行先往左走了一段距离,再往下走,说明了什么。
这说明,我们初始的位置,在下面一行已经被摧毁了,并且我们往下走的第一个位置恰好是下面一行的右端点。
那么我们就可以直接 dp 来计数了,设
第
然后前缀和优化一下转移就好了,复杂度
提交记录。
QOJ8047. DFS Order 4
题意
定义如下的树是好的:
- 对于所有非根的节点,其父亲的编号比自己小;
- 一个点的所有儿子编号按照从小到大的顺序排序。
问对于所有有
题解
首先考虑什么样的 dfs 序能被算进答案里面。
对于一个给定的 dfs 序,考虑逐渐往里加点,贪心构造一棵树。
假设当前整棵树向右的一条链是点
若
,则我们可以直接把 挂到 的儿子里面。否则我们需要找到一个位置
,然后把 挂到 的最后一个儿子。不难发现,这需要满足
,因为 挂上去之后是 的后一个兄弟。容易说明,按照贪心,我们一定是找到这样一个最大的
,然后把点 挂过去。
这样对于一个合法的 dfs 序,我们将其对应到了一棵树上去,而显然一棵树显然恰好有一个 dfs 序。
那么我们就可以对树进行计数,考虑根据上述的构造过程,什么样的树是合法的:
- 对于每一个非根节点,其标号比自己的父亲标号大。
- 对于一个点的所有儿子
,满足: ;- 对于
,点 至少有一个儿子; - 对于
,点 的最后一个儿子标号 。
我们现在需要对满足这样条件的树来计数。
我们不妨把这个限制画出来,其中一条边
这样不好计数,我们不妨先回忆,假设所有连边形成了一个外向树,方案数怎么算。
可以发现,答案是
我们将所有的蓝色边反转,然后删掉无用的边,发现原来的连边变成了一条链。
我们考虑对蓝边进行容斥,即删掉一些蓝色边,并且把剩下的蓝色边反转。
多玩几组就会发现,剩下的有用边总是一棵外向树,这说明我们的做法非常有前途!
考虑如果已经确定了每一条蓝色边是反向还是删掉,这棵外向树会长成什么样子。
假设现在点
首先无论如何,因为初始
那么考虑原先
这个时候整个
如果
(当然这种关系是可以嵌套的,例如上面那个图里面,连着两个反向边,导致旁边的子树挂在了奇怪的地方)
那么考虑 dp,设
转移的话考虑令
时间复杂度
提交记录。