05 2021 档案
摘要:题面传送门 类似最大流,我们肯定要考虑在残量网络上搞事情。 对于最大流,我们是原流+残量网络上源到汇的最大流。 那么感性理解一下,最小流就是原流-残量网络上汇到源的最大流。 code: #include <vector> #include<iostream> #include<cstdio> #in
阅读全文
摘要:题面传送门 按照常见莫反套路先拆式子 \(\prod\limits_{i=1}^{N}{i^{2N}}\times \prod\limit
阅读全文
摘要:题面传送门 说是模板却有一点建模难度。 关于有源汇上下界最大流可以看这篇博客这里只说怎么建边。 首先肯定是从源点向每一天连的边。 然后由每一天向对应的右部点连的边。然后跑网络流即可。时间复杂度 c
阅读全文
摘要:题面传送门 我们已经知道无源汇怎么办了,现在考虑有源汇。 可以发现除了源点和汇点都是满足流量守恒的。所以我们只要让源点和汇点流量守恒即可。 所以只要给汇点流向源点无限容量边即可。 但是这个只是一个可行流。不是最大流。 我们要想办法将其变成最大流。因为虚拟源和虚拟汇都被我流满了,所以改成在起初的源点和
阅读全文
摘要:题面传送门 这个东西看上去其实很难做。 有一个naive的想法就是把每条边的权值重新定为,然后跑最大流。 但是有一部分流量会飞掉。有一些点入流不等于出流。 这时候我们建一个超级源与超级汇。 设$cnt_u=\sum\limits_{(v,u)\in E}{low_{(v,u)}}-
阅读全文
摘要:题面传送门 其实在链上不是很好吗,为什么要把它上树呢 容易想到网络流。 但是有一个大问题就是网络流没有办法表示加和。 其实如果是普通线性规划这个东西不应该连续起来。 但是它连续了就有了可以做的办法。 定义为流量为,费用为的边。 如果我们连$(ST,1,I
阅读全文
摘要:题面传送门 盲猜了个结论然后居然对了。 如果我们把a看成,b看成,c看成,容易发现一次变换后所有值加和的值不变。 然后稍微想一想就可以发现除了之外,中一定至少一个相邻两字符相同。 所以这个是必要条件。 然后我猜这是个充分条件。 所以基础dp即可。 c
阅读全文
摘要:题面传送门 草不看题然后卡精度调了半天。 其实对于这种有的东西就是考虑wqs二分吧。 然后显然这个有凸性。 所以直接斜率优化一下即可。 code: #include <vector> #include<cstdio> #include<cstring> #include<vector> #in
阅读全文
摘要:题面传送门 因为这道题点名卡spfa,所以要用spfa。 本来可以跑轮spfa但是这个可能有负权边。 然而这个东西如果我们以为超级源跑一边最短路设为,那么显然有 所以我们更改每条边权值为因为这个只和两边
阅读全文
摘要:题面传送门 知道结论这个就很水了。 因为这个如果这个东西前面能划分掉一定不会等到最后划分所以一定是个凸函数。 然后直接wqs二分分一下然后决策单调性乱划即可。 时间复杂度不过感觉还跑得很快,最大点才700ms直接最优解。 code: #include <vector> #
阅读全文
摘要:题面传送门 设表示将及其后代打死的最小代价。 可以发现转移方程是这样的 发现转移成环,不太好做。 如果我们先把所有点放入队列,然后对于每个能更新答案的点将其父节点入队,再更新答案即可。 注意卡常。特别是用v
阅读全文
摘要:题面传送门 wqs二分可真是个神奇的方法。 首先这道题那个式子化简一下就是 易得设选个为这个东西是个单调下降的函数,且是个凸函数。 这个东西斜率优化显然可以做到 具体的,转移方程是$dp_{i,k}=\min\limits_{dp_{j,k-1}
阅读全文
摘要:题面传送门 看到k这么小容易想到状压。 设为以为当前要拓展的节点,包含集合为的最小值。 那么就可以两种拓展,就是这个点在最终答案上入度为,那么就找一条边走出去。 如果这个点入度不是,那么就划分成两个子树。 然后按照正序枚举,第一种可以堆优化dj跑一下
阅读全文
摘要:题面传送门 很妙的一道题。 根号算法在这上面只有分别想了。 因为随机化算法没有前途所以考虑随机。 容易发现如果我们知道了一个子树的节点,又知道它下一层点的子树,那么我们可以有一个树不询问而直接算出来。 这个子树随机即可,因为树剖的性质所以这个可以保证 code: #inc
阅读全文
摘要:A 题意简述:有一个的点阵,每两个点之间能连边当且仅当他们距离为或,定义一种边的选取方案是合法的要求边集内任意两条边不能共用一个端点。求边集的最大大小并输出一种方案。 并不会什么很靠谱的解法。 把每条边建出来
阅读全文
摘要:题面传送门 发现以前自己写的像那个一样。 首先两次dfs找重心是显然的。这个可以保证分治复杂度。 然后就可以开个桶直接算即可。 时间复杂度 code: #include<cstdio> #include<cstring> #include<vector> #include<qu
阅读全文
摘要:题面传送门 真是我学习高斯消元以来的做过最正经的一道题目。 编号这个东西不太好做,但是我们如果把每条边经过的次数算出来然后排序后赋权就可以达到最小。 所以是算每条边出现的期望次数。 然后因为太大实在不好弄,但是因为是随机跑的所以只要找到两端点出现次数然后除以度数加起来即可。 显然可以建立方程,
阅读全文
摘要:题面传送门 一眼看数据范围感觉像一只log 然后因为是位运算所以考虑分开拆位考虑。 分开后就是求矩阵内全与全的个数。 然后这个东西其实是单调栈经典问题,就是在单调栈预处理离当前向上距离最近的那个然后直接转移,中间那一段随便转移即可。 时间复杂度 code: #in
阅读全文
摘要:题面传送门 蛮好地题目。 刚开始没有想到取对数然后二分答案对于每个权值除看答案乘积是否大于 然后就被卡常了,搞了一下循环展开才勉强不开O2卡过去。 具体思路就是对模式串建出AC自动机然后在AC自动机上设为匹配到了点然后在AC自动机上第个节点。 这个东西滚
阅读全文
摘要:题面传送门 陈指导一个小时写完的东西我写了四个小时。 也算是对AC自动机和最大独立集有了更深刻的了解。 首先子串关系想到AC自动机可以做。 具体的只要把每个前缀的结尾往上跳跳到第一个其它串的结尾即可。 然后floyd传递闭包一下即可。 但是问题是如果真的暴力跳是$O(n\times \sum\lim
阅读全文
摘要:题面传送门 很平凡的分块啊不知道为什么要评黑题。 首先显然要预处理块间众数。 然后就是考虑零散块怎么处理。 用一个vector将所有一样的数存下来,然后零散块左边从右到做遍历,如果碰到一个数后ans个数没有超过右边界就直接将ans++ 右边同理。 时间复杂度$O(n\sqrt n)\(,因为vect
阅读全文
摘要:题面传送门 看到题面的瞬间想到超级钢琴。 然后写了个类似超级钢琴的东西发现会有重复然后就不知道怎么办了。 被题解点播了一下。 就是先跑出最优解,然后看最优解前个不动拿来拓展,这样每个分支不交就可以堆维护了。 时间复杂度 code: #includ
阅读全文
摘要:题面传送门 有撤销还可以离线。 就显然可以找到每个操作的左右端点。 然后写了线段树分治 这个东西之所以不能线段树分治的原因是因为他是要求顺序的。 所以直接写个高维数据结构即可。 因为不想写kdt所以写了个四分树反正数据随机 code: #include<cstdio> #include<vector
阅读全文
摘要:题面传送门 域值这么大显然不能把域值放到dp里去。 但是很小可以开两维。 所以可以设为子树内有个点被选择的最小费用。 但是这样状态表示很不明确。 所以再增添一维代表没选,选了而没有成为贡献,选了成为贡献。 然后平凡转移一下即可。注意树形dp常见的$O
阅读全文
摘要:题面传送门 希望早日有好的spj。 看到这道题应该可以直接秒了:枚举第一个串中的两个端点,然后枚举第二个串的重构循环开始的地方,两边跑lcp/lcs看能否成立。 然后你发现lcp和lcs显然可以hash+倍增跑出来,关键是判断的地方。 设为第一个
阅读全文
摘要:题面传送门 显然转化一下算贡献就是 根据拆max的套路拆成枚举大的然后正反跑两边。 那么树状数组维护一下即可。 code: #include<cstdio> #inclu
阅读全文