2024.6 做题记录
2024.6 做题记录
[JSOI2009] 球队收益 / 球队预算
考虑到要求最小总支出,想到最小费用流。
首先容易发现,每场比赛都只有两种可能,即甲输乙赢或甲赢乙输。但是这样我们在跑费用流的时候显然需要考虑对于两个因素同时的影响,显然这样不好做。我们不妨假设剩下的比赛所有人都输,那么我们就只需要考虑每一场比赛赢的贡献即可。
现在我们先考虑建图。首先有
现在的问题就在于如何计算赢一场比赛的贡献,也就是
考虑我们原先假设的是所有球队都输,于是如果一支球队在
如果将
最后我们跑最小费用最大流,最小费用再加上假设所有队都输的费用就是最后答案。
[CQOI2017] 老C的方块
首先它让我们求删去的最小费用,可以想到最小割。
观察题目中给出的四种不能存在的形状,我们发现他们有一个共同点:特殊边两边都有方块且两边的方块都还有一个相邻的方块。同时我们再观察题目,发现在特殊边两边的方块与和特殊边两边的方块相邻的方块是交替出现的。
那么既然要描述限制,自然想到黑白染色。我们可以将在特殊边两边的方块染成黑色,其余方块染成白色。但是这时候我们发现,如果想直接连边,同种颜色内的方块仍然会互相影响(也就是特殊边两边的方块仍没有规定顺序)。于是我们就想到再对每一类方块进行染色,将在特殊边左边和在特殊边右边的方块分成两种颜色,那么自然的,与特殊边左边的方块相邻的其他方块和与特殊边右边的方块相邻的其他方块也要分成两种颜色,同时我们还要满足颜色之间的连边顺序不能改变。
根据这样的思路,我们就可以染出下面的图(以题目中 |
表示特殊边):
3 4 2|1 3 4 2|1
1|2 4 3 1|2 4 3
3 4 2|1 3 4 2|1
1|2 4 3 1|2 4 3
3 4 2|1 3 4 2|1
1|2 4 3 1|2 4 3
3 4 2|1 3 4 2|1
1|2 4 3 1|2 4 3
此时我们发现,对于任意一种不能存在的形状,一定可以走出一条
当然,由于题目中给的是点权,所以自然还要用传统功夫拆点转化为边权。做到这里这个技巧应当是显然的了,不再赘述。
[SCOI2012] 喵星球上的点名
这道题牛就牛在它几乎没有任何一步是好想的。
首先我们看到姓和名是分开的,自然想到在中间加上一个字符。然后问题其实就是用多个模式串去匹配多个文本串,显然可以 AC 自动机,但是我们要用后缀数组。
考虑将所有文本串和模式串全部拼起来变成一个大串,两个串之间加上一个字符。现在我们跑出后缀数组,求出
于是我们想到可以求出对于一个模式串的开头,它向左向右最远能和哪些后缀匹配上。根据上面的结论,在这个开头左(右)边的点与这个点的 LCP 满足单调性,因此可以二分求解(RMQ 直接利用 ST 表即可)。
现在对于模式串的开头,我们可以得到一个区间
现在考虑第二问,为了保证莫队的根号复杂度,这一问的求解必须和莫队的复杂度一致。但是光靠记录文本串出现此时似乎并不能解决这个问题。此时我们考虑差分思想:当这个文本串第一次出现时,给它的答案加上剩余模式串的数量;当这个文本串不再出现时,给他的答案减去剩余模式串数量。这样我们就可以求出这个文本串究竟匹配上了多少个模式串。
[AHOI2013] 差异
首先看到题目中给了我们一个式子,但是我们看不懂这个式子,所以爆算一下:
现在后面那个东西要求
现在我们来看怎样求 LCP,显然考虑后缀数组。在求出
既然如此,我们就找出在
至于如何求解,显然这是单调栈的裸题。最后区间最小值为
最后算出所有贡献之和,乘上
[bzoj3230] 相似子串
首先题目中说的
那么现在我们一步步解决这个问题。首先就是题目中给出的是子串的排名,我们需要将其对应到后缀的前缀上。由于给出的是排名,那么我们只需要知道每个后缀的排名,然后二分查找出属于哪个后缀即可。
第二个问题就是如何求出后缀的排名。根据不同子串数量的思路,我们每个后缀所产生的新的子串是该后缀长度减去
现在我们求出了子串的排名,顺便就可以求出子串开头的位置和长度。接下来先考虑求出两个子串的 LCP,我们求出两个子串对应后缀的 LCP,再与两个子串的长度取
现在考虑求公共后缀。我们考虑将原字符串反转一次后求后缀数组。由于上面我们已经求出了子串开头的位置,所以自然能求出反转后开头的位置,也就是求出了反转后对应的后缀。将这两个后缀求出 LCP 与子串长取
将两者带入
[NOI2015] 品酒大会
首先我们先跑出后缀数组,接下来考虑求出所有
上面的做法显然是
对于
接下来既然知道这些区间都是
最后从后往前再更新一次,求出最后的结果即可。
[ZJOI2009] 对称的正方形
我们发现这道题可以理解为求一个回文的正方形,于是我们继续沿用马拉车的思想。考虑在矩阵中插入 0
,使得矩阵变成
考虑二分以当前格子为中心的回文正方形边长。现在问题就是如何判断。我们知道这个正方形要满足上下对称和左右对称,也就是说每一行和每一列都应该是回文串。假如当前格子是
显然我们用 Manacher 可以求出每个格子向上下左右能延伸的最长回文串,于是问题又在于判断所有格子延伸长度是否达到
这样做复杂度就只有二分的 0
减去即可。
[CERC2014] Virus synthesis
首先容易发现的性质是:最后的字符串一定是由偶数长度的回文串在加上两边的零散字符拼接而成。这个性质是显然的,因为奇数长度的回文串根本不可能被反转得到。也就是说,我们现在只需要考虑构造偶数长度回文串的步数,剩下所有字符串用的步数都是字符串长度。
现在考虑怎样构造偶数长度回文串。我假设 S
是一个回文串,a
和 b
分别是一段不回文的字符(a
非空)。那么这个偶数长度回文串只有两种表达:aSbbSa
和 SbbS
。
显然构造出后一种的步数就是构造出 S
的步数加上 b
含有的字符数,而由于 S
在结尾处,我们就可以使用 trans 数组找出这个 S
然后转移。设
现在考虑前面的情况,由于 S
不在中间,因此不能直接走 trans 转移。但是我们发现,从 SbbS
变为 aSbbSa
其实走的是最原始的回文树上的边。因此对于这种情况的转移为:
对于剩下的所有字符串,直接将
那么所有情况就讨论完了,现在考虑求答案。显然对于一个偶数长度回文串
但是我们发现这个 dp 转移似乎是在 DAG 上的,好像要用拓扑排序。实际上不然,由于 PAM 是一个一个字符添加的,所以保证了后加的编号都大于前面加的,也就是说
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现