随笔分类 - YbtOJ
摘要:思路 很显然直接用最小割处理这种问题(列个方程解一下,注意两点中间的边要用正权,其他的边的权值可以任意变换)。 发现现在的问题是求最大的方案,于是我们把边权取相反数,就转化为最小割问题了。 然而现在有一个问题,就是边权是负数,不能跑最小割,所以把其他的边权加上一个值变成正数,最后减掉去,就可以了。
阅读全文
摘要:思路 这道题网络流建模十分妙妙。 首先从源点 连一条流量为 的边到 ,从 连一条流量为 的边到汇点 。 把答案当做这张图的最小割,如果加了一条限制 ,那么也就是如果割掉了两个点同侧的边就不用其他费用,否则要加上费用。 发现要加上费
阅读全文
摘要:思路 显然直接建图跑个最大流,答案就是总蜥蜴数减掉最大流。 但是由于有高度的限制,也就是每个地方只能被走一定数量,还要加一些限制。 所以把每个点拆成入点和出点,从入点向出点连一条流量为 的边。 再枚举出每个格子能跳到的其他格子,从当前格子的出点向其他能跳到的格子的入点连一条 $+
阅读全文
摘要:思路 这题的转化很妙,我看了一下题解才想明白。 首先显然往返不需要走一个环,直接原路返回可以达到最优,所以危桥至多只能走 次可以和往返直接抵消掉。 变成危桥最多只能走 次,不需要往返,只要过去就行了。 那么想到用网络流,从超级源 向 源点 连边,从汇点 $
阅读全文
摘要:思路 先考虑二维的怎么做,发现选了一列要填,那么肯定是这一列都填一遍,然后发现如果有一个点要被填,也就是这一列和这一行只要要填一个,建出二分图,直接跑个最小点覆盖(也就是选出最少的点使得每条边都至少有一个点被覆盖,数值上等于最大匹配)。 然后转化到三维上去,就是直接枚举一维的覆盖情况,然后转化到二维
阅读全文
摘要:思路 考虑先对各点黑白染色,然后对于相邻的点连边建出二分图。 如果这个二分图有完全最大匹配(即每个点都匹配到了),那么先手必败,因为无论选那个点,后手只要向这个点匹配的另一个点走就行了。 如果是不完全最大匹配,那么先手必胜。 所以先手只要选到不一定在最大匹配中的点开始就一定赢,因为无论接下来后手走到
阅读全文
摘要:思路 考虑处理出原 dag 图的两两点之间能否可达(可用 Floyd),然后题中是求最大的若干点之间没有两两可达的点对。 那么建出二分图之后,发现如果出现一对匹配,那么相当于这两个点里面有一个不能选了,所以答案就是总的点数-最大匹配。 代码 #include<bits/stdc++.h> using
阅读全文
摘要:思路 会发现要求一个最大的完全子图(每个点两两之间有连边),所以考虑把建出原图的反图,然后每个点两两之间有连边就转化成为了每个点两两之间没有连边,也就是二分图的最大独立子集,是需要用总点数-最大匹配即可。 代码 #include<bits/stdc++.h> using namespace std;
阅读全文
摘要:思路 发现模板串最多只有一个*,所以考虑对于一个含有*的模板串,相当于链接了两个不含*的模板串。 所以我们先把所有的串转换为不含*的模板串,然后两两判断是否可以连边(因为只能有一个*,所以判断依据就是 $\operatorname{popcount}(u \operatorname{xor} v)=
阅读全文
摘要:思路 直接按照要求的走法可以建出一张 dag 图,发现就是跑一个最小路径覆盖,参见洛谷P2764,题解。 只需要用二分图匹配,每一次连接了一对匹配,相当于合并了两条路径(单个点也认为是路径),所以要让路径总数最小,就要让匹配的数量最大,由于是路径,所以每个点的入点和出点都最多只能连两条边。 代码 #
阅读全文
摘要:思路 问题转化为了在一张 dag 图上求出最小路径覆盖,见洛谷P2764,题解。 只需要用二分图匹配,每一次连接了一对匹配,相当于合并了两条路径(单个点也认为是路径),所以要让路径总数最小,就要让匹配的数量最大,由于是路径,所以每个点的入点和出点都最多只能连两条边。 代码 #include<bits
阅读全文
摘要:思路 会发现建完二分图之后,就是求哪些边一定在二分图的完全匹配当中的。 那就只需要求出这条边如果去掉,还能不能跑出完全匹配,如果不能了,那么这条边就一定在完全匹配中,否则就不在。 代码 #include<bits/stdc++.h> using namespace std;typedef long
阅读全文
摘要:思路 发现可以先建出一张图,每个节点表示每个订单,之间的连边 表示同一辆出租车能否先完成 号订单,再去完成 号订单。 这样,问题转化为了在一张 dag 图上求出最小路径覆盖,见洛谷P2764,题解。 只需要用二分图匹配,每一次连接了一对匹配,相当于合并了两条路径(单
阅读全文
摘要:题目大意 选出一个字符串序列 ,使得对于每一个 ,都是原串的子串,且每个 在 中都出现过至少两次,求最大的序列长度。 思路 发现其实可以做到让所有选出的字符串都是上一个字符串的后缀,因为如果后面留了一个尾巴,那么前面的字符串把这个尾巴砍
阅读全文
摘要:题目大意 给定 个主串和 个询问串。 对于每个询问串,求出最大的 ,使得存在一种将当前询问串拆分成若干个长度 且在任一主串中出现过的子串的方案。 思路 蒟蒻还是不会广义后缀自动机,所以我们就用 SA + st 表 + 二分 + 单调队列解决这道问
阅读全文
摘要:题目大意 给定 个字符串,求出每个字符串只属于该字符串的本质不同的非空子串的个数。 思路 如果没有做过这道 SA 入门题《不同子串个数》,那么请先了解这道题的 SA 做法。 首先老套路,把所有字符串拼接在一起。 然后单独考虑一个字符串 ,首先求出这个字符串的每一个后缀有多少个前
阅读全文
摘要:题目大意 给定 个模板串,以及 个查询串,依次查询每一个查询串是多少个模板串的子串。 思路 蒟蒻不会广义 SAM,所以只能用 SA + 莫队的高复杂度笨重算法通过了。 首先把每个模板串和查询串拼接在一起(中间用不同的字符隔开),然后跑一遍 SA,对于每个查询串,记
阅读全文
摘要:思路 蒟蒻不会 SAM,所以只好用 SA + Manacher + st 表 + set + 单调栈 + 双指针的笨重做法了。 首先处理出每个点为中心的最长回文串长度 ,以及以 和 为中心左右对称的最长回文串长度 ,这一步可以用 Man
阅读全文
摘要:思路 对于 的情况,直接建出后缀自动机,统计一下一个点为开始的字串有多少个,然后从上往下找就可以了。 对于 的情况,同样建出后缀自动机,统计一下每个字符串的出现次数,和刚刚一样做就好了。 细节不多。 代码 #include<bits/stdc++.h> using n
阅读全文