过年至 2.18 的比赛补题
近期题选
2.16 联考
T1
下饭。
对着错的大样例虚空调错 1h,然后清了一下谷歌缓存,重新下载大样例。
下文记文中集合为
看到出现次数,不难联想到 kmp。每次 kmp 的时间复杂度是
我们发现,每次 kmp 计算
机房老哥拿 SAM 过了。/bx。
先考虑 lcp 有没有什么神秘做法。然后仔细思考一下,应该没有。
所以把所有串反转,将 lcp 转化为 lcs。
然后字符串题,我们考虑建 ACAM。
(认真学一下 ACAM 再滚回来写)
T2
获得了高达
一看题解,前置知识部分不会,所以摆一下。
T3
36s 时限 /xia
50~55pts
问题显然可以转化为有多少个集合的
写了个常数飞天的算法,但是没挂分。因为你往 set 里加就可以了。时间复杂度是
如果拿线段树或者可删堆之类的维护,估计可以拿到
65~70pts
然后我们考虑
90pts
只需要额外实现
先考虑
考虑一个集合可能会在某个时刻以后变得不优秀,因为没有撤销操作,所以变得不优秀是不可逆的。(也即,只要变得不优秀了,就不会重新优秀了)所以每个集合不优秀的时间可以用时间轴线段树来维护。
具体的,维护一个时间轴线段树,来描述每个时间点处多出的操作,然后线段树上二分,用 BIT 统计答案即可。
分块做法摆。
2.17 联考
T1
剩下除了暴力的部分分都不是很好拿。因为不会有人只是不会线段树。
考虑如何快速求
我们先将问题转化为
然后考虑求
然后我们考虑如何统计答案。设
T2
在贪心以后,我们发现每一个庇护所对应的老鼠一定是一个区间,这样我们有了 dp 的条件。
剩下的牵扯决策单调性 dp。复习。
反正不管是写爆搜还是写随机化,都可以轻松拿到
T3
全身上下都是暴力分的题,设
Subtask 1 (10pts)
枚举
时间复杂度
Subtask 2 (30pts)
考虑
树状数组简单题。不管是每次清空树状数组算还是增量式修改,都可以过。
时间复杂度
Subtask 3 (40pts)
显然,如果
反之,为
时间复杂度
Subtask 4(50pts)
显然,这个问题可以转化为求
Subtask 5
我没有优秀做法。其做法已经与正解做法相差无几。
Subtask 6 7 (80pts)
容易发现,我们只用枚举
记
时间复杂度
Subtask 8(100pts)
考虑将判断相似的过程拟为字符串匹配。所谓的失配即判断将新的一位加入后还是否相似。如果
所谓的 还是否相似,也就是判断
DTCPC
B
考虑什么串可以让答案变小。
10101
可以变化为 01010
,1
的个数减少了一个。
这种题最难处理的一般是“连锁反应”,考虑什么时候会出现连锁反应?
只要不出现两个连续的 0,都可以连锁反应。
也就是,所有不全为 1,且不出现两个连续的 0 的串都可以化作一个 1,代码很短。
C
长度越小结果最优,根据样例的提示:得到括号序列短且多的是:()()()()
的情况,若有
问题转化为构造一个数组
对于一个
所以时间复杂度是
构造可以用 dfs 来构造。
D
机房老哥 KnownError_ 在打比赛的时候说是若只题,我不会。
恶补一下序列分治。
序列分治典中典题是 abc282_h。
一句话来说,区间问题 solve(l,r)
内统计所有跨过中点的贡献。问题被简化为了,如何求解一个区间所有跨越中点的区间的子区间的贡献,用
然后我们可以在
考虑到序列分治和二分双重的
H
考虑操作次数显然不会超过
考虑操作次数为
考虑从
可以用拓扑排序维护。
J
考虑任意一位操作偶数次都是没有意义的。
考虑最后的形态,我们希望最后的形态一定是 0
在前,1
在后,且都占据整个字符串的一半。
如果出现一个 1
,我们的一步操作可以使得这个 1
往后一位。
例如:1000
反转前两位后变成 0100
,再反转第二位第三位可以变成 0010
。
如果遇到两个连续的 1
,就可以全部化作 0
。这样的话最后的形态一定是末尾有 1 个或 0 个 1
,然后我们再从后往前将若干个 00
转化成 11
即可。
然后这个步骤不难发现,至多需要 考虑任意一位操作偶数次都是没有意义的。
这一说法,我们将操作序列去重即可。因为去重后的序列每一位数只有出现和不出现两种选择,一定 < n。
L
没有字符出现大于两次,则字符串至多有
M
考虑不寻常的数据范围。
由
然后我们发现
-
如果
内有重复的数,答案一定为 -
反之,对于
,这样的 一定合法。我们发现 。所以需要的考虑的 也只有 。
问题已经转化成
然后我们考虑怎么用 bitset 维护这个信息。
我们发现任意一组
维护
然后,我们考虑做差怎么用 bitset 维护,这是一个经典 tricks。先将所有
对于一个数
然后不管用 count 还是枚举转化过的
有一些细节。
think-cell Round
A
排序后选择所有下标为奇数的位。
B
构造 n 1 n-1 2 n-2 3 ... 的序列即可。
C
按照
D1
枚举子串,考虑
考虑选择的 1001001
这个样子。
考虑一个贪心:
- 对于
,如果我们已经将 标为 ,则 为 。 - 对于
,如果 为 ,则这一位为 。 - 对于
,如果 不为 ,则标记 为
最后统计
D2
考虑 dp。倒着
考虑新增一个字符对答案的影响。
如果
反之,什么也不用做,
答案是
E
组合数题。输。
考虑什么情况下可以达到最终情况。
考虑一个布尔数组:
结论是
枚举
由于
ARC172
A
考虑任意一个
我们考虑
不断分治下去,我们将原来的长方形转化成了若干边长为
这样判断下去,如果某一个大小的正方形不够了就是 No
。
时间复杂度的证明方式同辗转相除法,是
B
考虑不存在两个相同的长度为
也就是对于任意两个相同字符,他们之间的距离至少是
然后一开始是
C
没写完。输。
我们考虑假设将
而前面的投票结果可以增量式维护。从
D
神仙题。
构造方法有
因为是小于号,我们可以给每一项加一个很小的
考虑到这个
到这里,构造方法已经很显然了,越后输出的越小即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现