复 健 训 练
感觉高考考得一般般,估计要打 ACM 了,提前开始复健,大致在这里记录一些或许有意义的题。
估计接下来题解风格都会焕然一新。(大概)
[ARC122]
summary
实况:题不会想,代码也不会写了,真的爬了。
[ARC122 A]
solution
题面:一行有
做法:考虑算
复杂度
1 | //2021.6.12 by ljz |
[ARC122 B]
solution
题面:给定
做法:对
复杂度
1 | //2021.6.12 by ljz |
[ARC122 C]
solution
题面:输入一个小于等于
求构造一种方案使得
做法:考虑每次
复杂度
1 | //2021.6.14 by ljz |
[ARC122 D]
solution
题面:A 和 B 在博弈,两个人分别从
做法:对
若当前节点的左儿子内有奇数个数,说明右儿子也有奇数个数,则无论 B 如何取,总有一对分别来自两个儿子,于是暴力递归如两个儿子计算答案,这样的话,B每次可以狙击 A,即尽量保证 A 最小。
若当前节点的左儿子内有偶数个数,说明右儿子也有偶数个数,那么继续递归入两个儿子。
总复杂度
1 | //2021.6.18 by ljz |
[ARC122 E]
solution
题面:有
做法:考虑从后往前构造,下证明后面的选取不会影响前面。
假设前面的
即
根据第二条,可得
于是证出了后面的选取不会影响前面,因此暴力从后往前即可,时间复杂度
具体实现上,需小心爆long long
,稍微注意一些细节即可。
1 | //2021.6.24 by ljz |
[ARC122 F]
solution
题面:有
做法:先把绝对无意义的红石去掉,即
每个红石头右上角有
然后我们考虑
画一个坐标系,其中只有
对于每个蓝石头,从
容易证明此时从
然后我们再对于每个红石头,从
这样就可以使从起点到终点的路程被切成若干个区间,然后从
至于
复杂度
1 | //2021.6.27 by ljz |
[CF1534]
summary
实况:时间太迟了,脑子差到了极点。
[CF1534 F]
solution
题面:给你一个
你可以选择任意一块仍然在网格中的沙子并“干扰”这块沙子。当一块沙子被“干扰”后,它会从当前位置竖直下落,并最终掉出网格。另外,所有与一块下落的沙子经过的任意位置相邻的沙子也会开始竖直下落,任意下落的沙子都会使相邻的沙子下落(如果这一段看不懂,可以阅读样例,样例中用黑色方框标记的是被“干扰”的沙子,用叉标记的是自动下落的沙子)。
你的目标是使第
求你最少需要“干扰”多少块沙子。
做法:每一块沙对有影响的沙连边后(只连有直接影响的沙),缩点重新看这张图。
代码实现感觉挺麻烦的。下面代码已去掉调试,还是可以看看的。
1 | //2021.7.7 by ljz |
[CF1534 G]
solution
题面:你在一个二维平面直角坐标系的原点
现在给你
求最少花费多少单位能量。
做法:一种叫 Slope trick 的做法。
先考虑一个简单的事实,一个点到一条路径的切比雪夫距离最小肯定是经过这个点的斜率为
有这样的事实后,考虑将点以
具体实现上,我们每次加入一个点分三类讨论,若当前
时间复杂度
1 | //2021.7.10 by ljz |
[CF1534 H]
solution
题面:交互。
做法:经典两个相似名称的函数调用了,在 split_sz
中调用了 split
,调了我两个小时。
先思考它交互器返回的是什么,其实就是点
我们询问
但这存在一个问题,交互次数的问题,它要求我们按最小交互次数输出,这该怎么办呢?
我们再重新考虑最小次数是多少。设
我们利用这东西转移,最坏情况肯定是想要前面若干次询问都是无效的(无效就不会让我们递归入子树),直到当前有效是最大的才好。数字化表示,就是
它题目要求我们输出所有的
最终要求出两个端点,那我们考虑枚举
这个东西也是可以贪心地,想要最小,可以发现也是按
而如何交互的问题也迎刃而解了,是从最大的
坑:1. 因为有两个 split
,我一手贱就混用了,调了好久。
- 大小顺序容易写错,注意一下。
1 | //2021.9.6 by ljz |
[CF1537]
summary
实况:C 都想歪了,构造半天搞出怪的东西,导致 D 开始梦游。幸亏最后看眼 E2 发现后缀数组可以艹过去,不然就无了。
[CF1537 D]
solution
题面:有一个正整数
做法:先利用 sg 函数打个表,容易发现当
- 当
不是 时,
当
当
又因为最终停止只能是质数,而除了
- 当
是 时,
若减去的数不是
若减去的数是
综上,得证。
复杂度
代码有带打表的。
1 | //2021.6.21 by ljz |
[CF1537 E]
solution
题面:给出一个字符串
- 删去字符串的最后一位
- 循环倍长字符串
现想将
做法:先倍长
复杂度
代码是后缀数组的。
1 | //2021.6.18 by ljz |
[CF1537 F]
solution
题面:有一张无向连通图,每个点具有一个点权。现可将一条边连接的两个点的点权同时加或减
做法:
性质:若两点距离为偶数,则可一加一减同样的数;若两点距离为奇数,则可同时加减一个数。
- 有奇环。
当一张连通图有奇环,可以证明每个点要么在一个奇环上,要么不在环上(因为若一个点在偶环上,必然可以连接至一个奇环使得这个点在这个大奇环上)。
因此考虑将非环上的点按照拓扑序改变点权至
容易发现对一个奇环绕一圈加减相同的数时,最终的结果是可以使一个点加减
- 无奇环。
当一张连通图无奇环上,这张图则为二分图。
我们先考虑一个基础的四元环,容易发现此时有解是对角线之和相同的充要条件。放在二分图上,则是两部分分别的和相同。
现考虑一张二分图,同上般的去除一些点,剩下的只是一堆环上以及连接环和环的点了。通过改变连接环和环的点的点权,容易证明这可以让每个环两边的点权和都相同(因为在二分图上的改变并不影响两边点权和之差)。再根据四元环时的构造,则可以轻松证明二分图两部分分别的和相同是有解的充要条件了。
时间复杂度
1 | //2021.6.22 by ljz |
[牛客挑战赛51]
summary
实况:我是 口 胡 王!(并查集写错,LCT 写不动,瘫痪了)(随机开题也挺怪的)
[牛客挑战赛51 C]
solution
题面:给你一个正整数
做法:考虑求
1 | //2021.7.13 by ljz |
[牛客挑战赛51 D]
solution
题面:中文题面建议自己看。
做法:注意到贡献是独立的,所以没必要纠结长度为
1 | //2021.12.27 by ljz |
[牛客挑战赛51 E] [loj 2476]
solution
题面:给出
做法:
冷静一下,最后一条式子取
1 | //2021.9.25 by ljz |
[牛客挑战赛51 F]
solution
题面:所有
做法:注意到贡献是独立的,所以没必要考虑一棵树的贡献量,可以选择按深度来分开来考虑。
考虑深度为
1 | //2021.12.27 by ljz |
[牛客挑战赛51 G]
solution
口胡:区间加区间求和用权值线段树,加区间则用个 set
以区间左端点排序然后二分进去找到它应在的位置在 LCT 上加边删边,删区间同理。时间复杂度
题面:中文题面不会自己看?
做法:首先简化一下题意,它这个题面跟个鬼一样,还要倒腾半天。
操作一实际上就是对
题解做法我暂时还没看,不过 wxw 的做法应该暴打了标算。
注意操作一中修改位置的特征,以及区间互不交的特征。可以发现操作一修改的位置实际上就是在
1 | //2021.12.30 by ljz |
[ABC206 F]
solution
题面:有
做法:复习下博弈论。
令
1 | //2021.6.20 by ljz |
[CF1539 E]
solution
题面:有两个数
做法:容易写出一个
考虑优化这个暴力。发现每次能转移到
构造答案的话,按照上面贪心的思路逆着来即可。
复杂度
1 | //2021.6.23 by ljz |
[CF1539 F]
solution
题面:有
做法:设
时间复杂度
1 | //2021.6.24 by ljz |
[ULR #2]
summary
实况:一题都不会,精彩。
[ULR #2 A]
solution
题面:中文题面不会还要写吧,不会吧不会吧。
做法:考虑一种其他做法:设
不过这个做法有点不好实现,建议使用官方题解。
标准做法是考虑将每次操作合并成一个大操作,使得最后只剩下一个数,然后考虑这种操作序列的个数。推出式子后,注意到
代码是
1 | //2021.6.28 by ljz |
[ULR #2 B]
solution
题面:中文题面不会还要写吧,不会吧不会吧。
做法:由于