10.12 开始写,每天做的题都在这里了。
AT_arc058_b
考虑组合数。
对于从 走到 的方案数,显然是 。那么考虑枚举一个行 ,我们需要从 走到 。这样能够使得我们的每一步都没有走到不可走的区域,然后从 走到 。时间复杂度是 的。
AT_arc059_b
考虑答案上下界。
答案下界显然是 ,因为要求 。对于一个满足条件的子串 ,令其众数为 。有 种情况:
-
存在连续的 ,使得 。此时直接构造 是对的。
-
不存在连续的 ,使得 。那么一定存在 ,否则众数不为 。证明简单。此时构造 是对的。
所以答案上界为 。然后暴力枚举 即可。时间复杂度是 的。
AT_arc061_b
考虑暴力枚举。
发现 很大,但是对于一个黑点 能够贡献到的 的网格数量很少。所以对于每一个黑点 ,我们去枚举它能贡献的所有 的网格的中点 。改变一下它的黑点数量,随便维护一下即可。对于一个 的网格,它里面 的网格数量为 。时间复杂度 。
AT_arc064_b
很难啊。
题目翻译没有说不能选两端的字符,但是就是不能选。
如果没有不能选两端的限制,考虑怎么做。对于当前字符串状态 ,若存在一个 ,使得 。直接删掉。否则字符串 一定是 种字符交错排列的,删掉头即可。那么,对于没有限制的情况,当 是奇数时,先手必胜;反之同理。
现在考虑不能选两端的情况。那就相当于删掉了字符串的头和尾,然后没有限制地删。如果删头的时候出现了两个字符相同的情况且删尾也有同样的情况。那么此时字符串长度为奇数,且原字符串的头和尾均相同。先手必败。反之同理。
AT_arc066_b
好难啊。真的只有蓝嘛。
考虑 DP。定义状态函数 表示从高往低第 为, 时不同的 的值。然后考虑第 位放什么:
- 个 ,此时有:。
- 个 和 个 ,此时有:。
- 个 ,此时有:。
然后就没有了,观察到有用的状态数不多,直接暴力即可。这题记忆化搜索就行了,纯暴力是 TLE 的。
AT_abc051_d
,考虑暴力 Floyd。对于 Floyd 中的 ,如果有 的边,那么这条边在 的时候将会被松弛,也就是说这条边没用了。统计一下有多少条边满足条件,由于每条边都算了 次,所以实际答案是该数量的 。时间复杂度 。
AT_abc054_d
直接暴力地 DP 即可。没什么好说的。
CF833B
考虑 DP。
定义状态函数 表示前 个数,分成 段的最大价值。有:。难点在于求 。发现这玩意满足四边形不等式,但是直接记录 表示颜色 在上一次的出现位置,那么在区间 的 都会增加 的贡献。直接放线段树上维护,优化 DP 即可。复杂度 。
AT_arc108_e
考虑区间 DP。
定义状态函数 表示钦定选择了 时,区间 还能选择的期望数量。则有:。其中 表示 的数量。不难发现, 中的二者独立。所以当我们枚举 后枚举 时,我们可以通过任意方式快速得到 , 和 。然后加起来就行了。使用树状数组的时间复杂度是 的。
CF321E
考虑 DP。
定义状态函数 表示前 只狐狸分成 组的最小代价。那么有转移方程:。发现 满足四边形不等式,证明:
定义 。那么有:。其中有:。所以 。
然后对于每一组分治即可。具体地,对于当前区间 我们能够得到决策区间 ,使得任意一个 ,都有 。能够先算出来 的值,那么根据决策单调性就有 左边的所有点的决策区间变成 ,右侧同理。所以时间复杂度是 的。
P9338
这题怎么这么难。
考虑 DP。
首先发现将 分成 个子序列与分成 个子序列是等价的。所以只需要求最少的子序列数量,使得它 。将 看成 的网格中的一条路径,将 看成向上走, 看成像右走。那么一次交换 的操作就会使右上变成上右。一条路径有解首先需要使得这条路径始终在对角线的上方。
根据贪心,分成的区间数量至少是这条路径的拐点数量。每次往右拐相当于一个区间。继续观察可以发现,一个区间的代价为这个拐点到原区间的拐点中间的面积数量。
然后就能 DP 了。令 为第 个 之前 的数量,, 为 的 的数量, 为 的 的和。 那么就有:。
把式子拆开:
定义状态函数 表示前 个数分成 段的最小代价,有:。然后就能够斜率优化。又因为 满足四边形不等式,所以套用 wqs 二分可以做到 。
CF1637G
/bx 多头老师
不容易观察到最终的数是 。只要我们能够构造出来一个 ,那么就可以通过倍增的方式将所有数变成 了。那么对于每次操作,我们需要找到一组 ,使得 。
考虑如何实现。首先可以找到当前最大的一个数,然后枚举 ,使得存在一个 。能够证明该做法一定是正确的。因为如果连最大的数都不行,那么小的数可能不行了。如果大的不行,那么考虑在之后将它操作,也就是继续选择次大的数,并将这个数暂存一下。最后剩余一个数时就是答案了。时间复杂度是 的。
P11184
考虑一个余数 满足条件的限制。因为 ,且 。所以直接求解就行了。
P11185
按照三种情况分别排序。那么一个同学的最终排名就是这三种情况排名最靠前的一个。
P11186
考虑对这个表达式建树。对于点 ,我们记录它的值 与判断符 。分情况讨论:
-
是小于号,则一个查询数字 小于 时答案一定存在于 的左子树,反之同理。
-
是大于号,则一个查询数字 小于等于 时答案一定存在于 的左子树,反之同理。
如果对于每个询问的 都去搜索一遍的话,时间复杂度将会达到 。考虑优化。
既然在线比较困难,那就离线看看。对于当前节点 ,我们能够得到一个询问区间 ,使得这个区间中任意一个 对应的答案都存在于 的子树中。那么,依旧分情况讨论:
-
是小于号,则查询区间中数字 小于 时答案一定存在于 的左子树,反之同理。
-
是大于号,则查询区间中数字 小于等于 时答案一定存在于 的左子树,反之同理。
记最后一个答案在 的左子树中的询问下标为 ,则 的答案一定在 的左子树中, 的答案一定在 的右子树中。分治下去即可。这样的话时间复杂度是 的。
注意特判 的情况。
P11187
考虑 DP。
定义状态函数 表示子序列的最后一位的值为 ,且已经/没有连续两个 时的最大子序列长度。那么我们枚举 ,有:。前者直接转移,后者拿一个线段树随便优化就行了。这样的时间复杂度是 的,但是存在线性做法。
P11188
考虑 DP。
首先发现性质:当一个数的位数 时,进行操作一一定优于操作二。因为数据范围有:。
那么操作二时数的长度就不会超过 了。定义状态函数 表示从后往前第 位,保留了 位时删完的最小代价。那么有:。时间复杂度 。
P11190
考虑答案长什么样子。
对于不相同的一组 ,我们可以将它们拼起来。那么就会得到若干个二元组,然后剩下一些相同的 。此时我们只需要考虑如何将剩下的字符放进这些二元组内,如果可行则答案一定是二元组数量。
令剩下的字符为 ,如果有一组 ,使得 且 中有些的下标大于 ,那么可以将它们全部拼到这个二元组后面。另一种情况同理。
如果还剩有字符,考虑替换两个二元组 和 。使得其能够容下更多的字符。
如果还有,那么无解。可以证明,无解的情况只有形如: 和 。也就是无法分解的回文串。
之后就只剩下模拟了。注意,拼二元组的时候需要优先将当前的众数与其它的字符进行拼接,以保证能够容下更多的字符。实现难度不大,细节较多。时间复杂度 。
CF2025A
如果操作 ,最优方案显然是先弄个最长公共前缀然后自己弄自己的。那么把最长公共前缀求出来就行了。时间复杂度 。
CF2025B
数感好的秒出答案。数感不好的果断打表观察规律。发现对于 ,若 ,则其值为 ,否则为 。时间复杂度 。
CF2025C
注意读题。发现题目中有这么一句话:Monocarp 可以取任何一张符合条件的牌,不管它在牌组中的位置如何。
那么这题就好做了。不考虑顺序,直接将 序列排序。然后使用双指针即可。时间复杂度 。
CF2025D
注意到除了能增加智力或力量的那 个点外,其它的点貌似没什么用。令 表示第 个能获取属性点的下标。定义状态函数 表示前 个点中,智力为 时能够通过的最多的检查点数量。
那么有转移方程:。其中 为区间 中检查点所需的智力不超过 的数量, 同理。时间复杂度 。
CF2025E
考虑 DP。
注意到对于一种花色 ,第一个人得到的一定不多于第二个人得到的。因为一旦比第二个人多,那么他一定会剩下一些这种花色的牌,并且用不出去。那么对于第二个人比第一个人得到的该花色的牌多的情况,此时只能由第一个人得到的多的花色为 的牌抵消掉。
那么思路就有了。我们只需要求出一个 ,表示 这些花色中,第二个人比第一个人多 张牌的方案数(其它的牌都两两抵消掉了)。然后再求一个 ,表示第一个人比第二个人多 张花色 的牌的方案数。那么答案就是 。
对于 ,不难发现是由 经过 次背包转移得到的。因为每种花色对应的方案数相同。这里的 和 的区别仅在于是第二个人比第一个人多 张牌。那么只要求出 ,就能得到 ,从而得到 了。
定义状态函数 表示前 张牌,发给第一个人 张,第一个人比第二个多 张的方案数。那么分类讨论:
- 第 张牌给第一个人,有:。
- 第 张牌给第二个人,有:。
那么有:。
然后 和 就能相继求出来了。时间复杂度 。
AT_jag2018summer_day2_i
很显然,有还原的题基本不能用势能分析做。
考虑线段树。
考虑换个方式维护。因为这题目有区间加法和区间除法。我们记录下来每次除法之后,得到的商、余数和除数。即:。其中 是商,也就是当前的值, 是除数, 是余数, 是除法前的数也就是被除数。
那么,考虑一种映射:。对于每个数,我们都记录下来最近一次除法或加法后得到的商、余数和除数。那我们就可以快速得到当前这个数实际上的值了。及其分别为 。
加法操作。直接就是在 上面进行加法操作。
除法操作。假设该操作为区间除以 。这里的 并未改变,我们需要调整的只有该映射中的 。所以有:。在这里,我们将 写成了 ,方便计算。然后除法操作就可以直接维护了。
还原操作。我们再维护一个 ,表示当前节点在最开始的区间 值。那么一个还原操作就相当于将当前的 值变成 ,并且清空其映射的参数。记录一个懒标记表示该节点的子树是否需要全部还原即可。
询问操作。直接就是正常的区间询问最大值,不再赘述。
该算法的时间复杂度为 。有一个小细节,就是在我们维护的 这个参数比 大时,能够证明 的增加是无效的。所以可以直接让 成为其中一个能够被接受的值。不然可能会 RE 或者 WA。
P8600
好像是我今年在中山集训的某场模拟赛 T4。当时太菜了,只因没做过套路题。
首先这道题可以转化成求有多少个区间 ,使得 。然后这种问区间数量,且存在区间最大、最小值的题。有一种套路,详见 AT_abc248_h 的题解。第一次遇到这种套路是在做 Norma 的时候。感觉很强啊。
考虑分治。我们枚举左端点 ,那么现在已知 。令 。我们能够通过指针找到最远的一个 ,使得 。也能找到一个最远的 ,使得 。现在进行分类讨论:
- 。此时区间最小、最大值固定。那么有:。
- 。这时有两种情况,以 为例。此时区间最小值固定,区间最大值与 相等。那么有:。
- 。此时区间最小值与 相等,区间最大值与 相等。那么有:。
上面的所有满足条件的 都可以分别用桶存起来,所以访问是能够做到 的。故时间复杂度为 。
CF526F
将二维问题转化成一维的问题。让 ,那么问题就变成 了。这能 *3000???时间复杂度 。
P10587
考虑势能线段树。
不难发现,当 时,小Y 喜欢的数只有 个。这里使用两种势能,第一种表示 这个数可能成为小Y 喜欢的数的势能,第二种表示 这个数达到 的势能。
对于区间加法操作。我们令 表示 与第一个比 大且是小Y 喜欢的数的差。对于每个节点,维护 表示该节点维护的区间中 最小的值。进行分类讨论:
- 。此时势能无影响,且对答案无影响。直接做区间加法即可。
- 。此时区间总势能至少减 。下传继续维护区间加法。
对于区间乘法操作。每个数的初始势能不大于 ,一个区间的总势能至少减 。下传继续维护区间乘法。
对于区间覆盖操作。该操作将会使一个区间的两种势能统一,且恢复原来的势能需要 的代价。直接进行区间覆盖即可。在这里,对于一个区间所有数都相同的时候,加法操作和乘法操作均能够将该区间视做单点,所以无需下传维护。
对于区间询问。我们因为 ,我们记录每个点维护的区间中 的数量,记为 。当该点的 时,答案即为 。否则为 。
根据势能分析,该算法的时间复杂度为 。
AT_arc059_c
考虑 DP。
发现数据范围不大,定义状态函数 表示前 个小朋友,一共得到 颗糖的愉悦度。那么有:。
观察式子,发现 可以通过前缀和预处理出来。令 。那么转移方程可以写成:。时间复杂度 。
P3605
考虑将树转化成 DFS 序。那么就是查询区间 中比 大的数的数量了。拿一个主席树,维护的值域线段树。然后直接查询就行了。时间复杂度是 的。
AT_arc060_c
考虑倍增。定义 表示从 开始尽量往右走,走 天后能够到达的最远的点。那么对于询问 ,就是求一个最小的 ,使得 往右走 天后离 最近。这个倍增跳的时间复杂度是 的。
AT_arc067_c
考虑 DP。
根据题意就能直接定义状态函数并且正确的一题。定义状态函数 表示到 个人一组的组,一共分了 个人的方案数。那么能够得到转移方程:。其中 表示 的情况。 表示选出 个人的方案数。而 表示将这些人分成 组的方案数,这里可以简化成 。
考虑快速计算 。发现这是一个前缀积的形式,令 ,则有:。那么转移方程就可以写成:。
因为 是一个调和级数的形式,所以该算法的时间复杂度为 。预处理 即可。
P4269
DP 的转移不难,难点在于去重。令上一次 出现的位置为 。我们能够得到 与 形成的上升子序列的数量。而这里面恰好完全包含了 与 形成上升子序列的数量。而 。所以只有 与 形成的上升子序列是新增的。所以记录一下上一次 对应的数量即可。时间复杂度 。
P6477
对于一个 ,我们有 。令 表示上一次 出现的位置。那么 这段区间所有位置的 都会增加 ,其余位置不变。所以 比 多 。直接维护即可。时间复杂度 。
P6569
矩阵快速幂。构造 的矩阵,若 为 ,则表示有一条 到 的边。那么,就可以直接矩阵快速幂优化了。朴素的时间复杂度为 。若将 预处理出来,则可以做到 。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性