省选之后的一些专题
省选之后的一些专题
oyds - 杂题
希望不会重名(因为之前好像有一个oyds的专题)
P9523
一个有点意思的串串题 + 区间 dp。
题面
给定串
- 用
代价写下一个字符 - 用
代价剪切当前写下的字符串,即Ctrl+A,Ctrl+X
- 用
代价粘贴当前剪切板上面的字符串到目前串的末尾,即Ctrl+V
求打出来
Sol
考虑过程是怎么样的,由于每次是剪切,那么一定是最后手中握着一个串
这样就可以快速想到一个比较显然的区间 dp:
相当于枚举
但是这个复杂度是不太能接受的,但是看起来确实是有前途的,不难发现有些时候两个区间找到的
qoj1249
题面
有若干个鱼在池塘里面,每一次进行如下操作:
- 加入一条大小为
的鱼 - 删除一条鱼
- 询问:假如加入一条大小为
的鱼,之后这条鱼可以不断地吃比起小的鱼,如果这条鱼吃了一条大小为 的鱼,其大小会变大 。问最少吃几条鱼能够让这条鱼大小至少为 。
Sol
先想一下吃的过程,就是大鱼每一次吃比起小的尽可能大的鱼。
有些时候,一个鱼吃了另一条鱼,可以让其吃掉一条之前吃不到的鱼。注意到这个过程最多进行
思路逐渐出来了,每一次考察一条鱼吃哪些鱼能够“升级”即可,复杂度
具体实现上,维护一个平衡树,支持回滚即可。但是写起来花了非常久时间,主要是回滚有点鬼畜,而且有傻子没有必要的多加了一只
或者写权值线段树,这个感觉上还好一点。
qoj3994
请自行阅读题面
Sol
关键点在于考虑最优策略是什么(这类题都是这样的)。
如果
如果蓝有意义,发现如果一个关卡不能回蓝,那么还是只有血量在
也就是说需要找到一个
感觉这个看代码理解更快
for(int i=n;i>=1;i--){
if(hav[i]){
for(int h=2;h<=H;h++)for(int s=0;s<=S;s++)g[h][s]=inf;
for(int L=2;L<=H;L++){
f[i][L][S]=(f[i+1][L][S]*p[i]+(1-p[i])*t1+1)/p[i];
for(int h=L+1;h<=H;h++)f[i][h][S]=1+f[i+1][h][S]*p[i]+(1-p[i])*f[i][h-1][S];
for(int h=2;h<L;h++)f[i][h][S]=(L-h)*t1+f[i][L][S];
for(int h=2;h<=H;h++)for(int s=0;s<S;s++)f[i][h][s]=f[i][h][S];
for(int h=2;h<=H;h++)for(int s=0;s<=S;s++)g[h][s]=min(g[h][s],f[i][h][s]);
}
for(int h=2;h<=H;h++)for(int s=0;s<=S;s++)f[i][h][s]=g[h][s];
} else {
for(int h=2;h<=H;h++){
for(int s=0;s<=S;s++){
if(h==2&&s==0)f[i][h][s]=(f[i+1][h][s]*p[i]+(1-p[i])*t2+1)/p[i];
else if(h==2)f[i][h][s]=f[i+1][h][s]*p[i]+(1-p[i])*(f[i][h][s-1]+t1)+1;
else f[i][h][s]=1+p[i]*f[i+1][h][s]+(1-p[i])*f[i][h-1][s];
}
}
}
}
AtCoder-utpc2021_l
题面
一个四联通的网格,初始有一些位置被堵住了。Alice 和 Bob 玩游戏,每一次可以堵住一个格子,如果堵完止呕
Sol
先不上结论,先考虑一下最终局面会是怎么样的。
如果开始的时候 Alice 能够一步获胜就会获胜。反之,两者都会避免出现让对方一部获胜的情况,如此下去,最后一定剩下两条不交的从
注意到这两条路径的长度奇偶性相同,也就是说,只需要开始判断 Alice 能否一步获胜,如果不能判断没有被初始堵住的位置的奇偶性即可。
hz - 杂题
上周在造数据,没什么时间写总结,本身也没有写几道题。
上课写专题,晚自习或者别的时候写一下 CM 的。
Grouping
题面
物品分组,多少组都可以,如果
Sol
?随便做
CF1741G
原来前面两题是状压练习。
题意
给一个无向连通图,有
顺路:他的家在有车朋友回家的最短路上的朋友
Sol
注意到大部分人都有车,只需要考虑那可怜的
然后合并每一个有车人家的位置的状态即可。
P3226
仍然是状压,但是有点乱搞。
题面
从
Sol
需要一点构造技巧,选择一个数
当然,由于有些数不会存在第一个数表里面,如
至于复杂度分析,初步看起来是不行的。但是会发现直接写是能通过的,甚至不需要任何优化,大概原因是后面几行的数字只会越来越少,到不了极限。
P2345
题面
给定一个网格图的第一行和最后一行的颜色,颜色数量
Sol
同样是暴力状压 + 减枝。有两个大方向,一种是记录每一行的状态,然后把可行转移跑出来,但是我这样写不是很优秀。另一个就是类似轮廓线的思路,记录折线上方的情况。这个加上几个剪枝,如不转移为
CF449D
题面
给出一个长度为
Sol
用到 SOS dp 的技巧,也就是高位前缀和。记得之前在 nfls 有一个位置也写过这个东西的,但是那个处理的不是二进制。
基本的思路就是,对于
对于本题,设
历史研究
题面
给定数列,若干询问求
Sol
经典的回滚莫队。
普通莫队做这个问题遇到的唯一问题就是缩小区间的时候无法快速更新答案,这时候考虑回滚莫队。正常莫队操作之后,假设目前考虑所有左端点在
什么意思?注意到左端点全部在
复杂度根号。
P4396
题面
给定序列,若干询问,求
Sol
没错,可以值域分块,但是我选择 cdq。
考虑一个位置表示成
P5309
理解能力变弱了。
题面
给定序列,每一次修改形如给所有
Sol
分成两部分,如果
如果
对于第一个部分的查询就是普通分块,第二个部分的查询相当于要知道
P4168
题面
给定序列,求区间
Sol
给上面的一个题有点像,但是强制在线导致不能直接用莫队,这种不可叠加的东西没有直接的 ds 能够维护,考虑分块。
想一下分块询问是什么样的,即中间的整块和两边的散块合并。回到这个题,计算中间的整块的众数,不妨设
P4462
题面
给定序列,每次询问
Sol
感觉放这个题的目的是为了讲在线做法——大力分块。
离线注意到
cdw - 杂题
CF1083F
题面
给定两个序列
单点修改并每次查询相似度。
Sol
区间操作,第一反应除了 ds 以外就应该是差分。先对两个序列差分,差分之后再将两个序列合并。这下变成:
- 操作:将
同时异或上 - 询问:将
全部变成 的最小操作次数。
注意到第一个操作可以将
下面问题是如何快速计算最优解,会发现,一个数按照我们的贪心策略需要被操作当且仅当这个数的前缀和(链上的)
再实现上面,如果真的去模拟出来每一个链表之后分块是很愚蠢的,因为要开各种东西。有一种好的方法是把所有链表接起来,形成一个序列,对这个序列分块。这样修改从后缀变成了区间,但是反正是分块所以复杂度没变。
P8544
太久没做题了,看到这个题真的让人眼前一亮。
题面
给定长度为
对于
- 同一行中的数字各不相同
- 同一列中,相邻的两个数字不能相同
- 所有元素
。
给定
Sol
看到之后手玩了一下,第一反应,这个矩阵是不是有点诈骗?因为对于列的限制只在于相邻两个数的,因此,如果找到了前两行的最优解,之后每一次奇偶交替填就能够保证两行之间的答案一直是这个最优答案。
那么问题就和
匹配!因为每一个点作为起点只能被用一次,作为重点只能用一次。那么不妨进行建模,对于
但是真的要跑费用流就有点过于 naive 了,复杂度显然会爆炸。这种情况不妨抛开费用流,考虑模拟费用流。不过这个题还不能完全抛开,现在这里埋一个伏笔。
我们需要观察一系列的性质,因为杂乱匹配一看就是没有前途的。考虑
总结来说,最后相当于把序列分成若干连续段,每一段都是一个环。还可以再进一步,因为一个大小
然后考虑
- 延续上一次的链
- 新开一个链
- 注意链随时可以断掉,因此转移上面两个之后
- 加一个长度为
或 的环。 - 跳过这个点
但是这样复杂度还是不行的,此时就要收回之前的伏笔了。因为这是一个费用流的模型,费用流模型有经典结论,流量关于答案的图像是一个下凸壳的右半部分,这个结论好像之前某次凸性专题里面就提到过。由于是凸的,而且是形如选择
ARC152E
题面
数轴上有
问在
Sol
妙妙题。
合并让人主观上感觉是很好的, 因为他们合并只会干扰他们两个点,其他点不受影响。但是只知道这个好像没什么用。需要一个更好东西来刻画往哪边运动。
令
这也就意味着,满足条件当且仅当,
LOJ2398
题面
交互,有一个位置的无向联通图,每次询问形如
Sol
第一反应是简单的
第二反应是可以维护一个已经知道的图形状的联通子图
这个直觉是极为正确的,下面讲正解。
维护
- 知道
直接联通,怎么样二分出来具体有哪些点?
我们希望用某种方式排出来所有的点,使得每一次询问一个
- 知道
,怎么样找到一个 ?
令
学校电脑突然死机了,可能是我跑的东西有点多导致的。生气。
LOJ2846
题面
平面上有
Sol
首先注意到这个题计算两个点的距离加和是比较大的,即使用 bitset 也是
口胡环节,直观上感觉如果从左下角走到右上角,如果这个矩形当中有点,那么先经过那个点一定不劣。
这个结论是比较正确的,但是需要将其应用。有引理,如果以当前在的点为原点建立直角坐标系,那么下一个点一定在某一个象限或者坐标轴的某一个正负方向的最近的点。这样看起来只需要建边为
注意到每一次建边是连接一个
CF354D
题面
一个
- 选择一个格子用代价为
将其染黑 - 选择一个底边在正三角形底边的小三角形,将其染黑,代价为点数
。
给定
Sol
只用第一个操作,代价为
考虑按照斜对角线来 dp,即对应的
要么延续要么新开一个,当
P6575
题面
给定无向图,定义
- 每一个点恰好在一个集合里面
构造方案,可能无解。
Sol
人类智慧,这个真的口胡不出来。
首先,题目允许枚举出来包含任意一个点是否有合法的
考虑当前的集合为
这一部分复杂度
Lemma:如果
令
这就简单了,只需要对于所有的集合
需要一定程度的卡常,主要是快速判断不合法。
CF1770F
题面
给定非负整数
Sol
非常人类智慧,不论是用 Lucas 转化还是范德蒙恒卷积来化
全部情况的异或比较少见,稍微想一想就会发现,如果
只需要考虑为奇数的情况,枚举
这个看起来是很绝望的,但是只需要稍微转化,根据 Lucas:
转化得到
枚举
ARC148F
题面
造计算机,令
Sol
蒙哥马利算法:
记
令
这对于算
但是有问题,这里最后没有办法直接
因此,可以让
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】