随笔分类 - 洛谷luogu
摘要:思路 直接 dfs 一遍。 首先,一个子树内的点都是一遍 dfs 到的,那么直接差分一下,到达 $u$ 的时候记录当前的 $>p_u$ 的个数,然后 dfs 完 $u$ 的子树的时候,记录 $>p_u$ 的个数,相减即为 $u$ 的答案。 代码 #include<bits/stdc++.h> usi
        阅读全文
                
摘要:思路 模拟赛的题,有点板。 直接建出原图的 Kruscal 重构树,然后发现询问变成了一个子树内区间第 K 大。 直接转化到序列上然后主席树即可。 代码-P4197 Peaks #include<bits/stdc++.h> using namespace std;typedef long long
        阅读全文
                
摘要:思路 很显然直接用最小割处理这种问题(列个方程解一下,注意两点中间的边要用正权,其他的边的权值可以任意变换)。 发现现在的问题是求最大的方案,于是我们把边权取相反数,就转化为最小割问题了。 然而现在有一个问题,就是边权是负数,不能跑最小割,所以把其他的边权加上一个值变成正数,最后减掉去,就可以了。 
        阅读全文
                
摘要:思路 这道题网络流建模十分妙妙。 首先从源点 $s$ 连一条流量为 $a_i$ 的边到 $i$,从 $i$ 连一条流量为 $b_i$ 的边到汇点 $t$。 把答案当做这张图的最小割,如果加了一条限制 $(x,y,v)$,那么也就是如果割掉了两个点同侧的边就不用其他费用,否则要加上费用。 发现要加上费
        阅读全文
                
摘要:思路 显然直接建图跑个最大流,答案就是总蜥蜴数减掉最大流。 但是由于有高度的限制,也就是每个地方只能被走一定数量,还要加一些限制。 所以把每个点拆成入点和出点,从入点向出点连一条流量为 $h_{i,j}$ 的边。 再枚举出每个格子能跳到的其他格子,从当前格子的出点向其他能跳到的格子的入点连一条 $+
        阅读全文
                
摘要:思路 这题的转化很妙,我看了一下题解才想明白。 首先显然往返不需要走一个环,直接原路返回可以达到最优,所以危桥至多只能走 $2$ 次可以和往返直接抵消掉。 变成危桥最多只能走 $1$ 次,不需要往返,只要过去就行了。 那么想到用网络流,从超级源 $s$ 向 源点 $a_1,b_1$ 连边,从汇点 $
        阅读全文
                
摘要:思路 先考虑二维的怎么做,发现选了一列要填,那么肯定是这一列都填一遍,然后发现如果有一个点要被填,也就是这一列和这一行只要要填一个,建出二分图,直接跑个最小点覆盖(也就是选出最少的点使得每条边都至少有一个点被覆盖,数值上等于最大匹配)。 然后转化到三维上去,就是直接枚举一维的覆盖情况,然后转化到二维
        阅读全文
                
摘要:思路 考虑先对各点黑白染色,然后对于相邻的点连边建出二分图。 如果这个二分图有完全最大匹配(即每个点都匹配到了),那么先手必败,因为无论选那个点,后手只要向这个点匹配的另一个点走就行了。 如果是不完全最大匹配,那么先手必胜。 所以先手只要选到不一定在最大匹配中的点开始就一定赢,因为无论接下来后手走到
        阅读全文
                
摘要:思路 第一问 第一问与YbtOJ「图论」第1章 二分图匹配 J. 祭祀一模一样。 考虑处理出原 dag 图的两两点之间能否可达(可用 Floyd),然后题中是求最大的若干点之间没有两两可达的点对。 那么建出二分图之后,发现如果出现一对匹配,那么相当于这两个点里面有一个不能选了,所以答案就是总的点数-
        阅读全文
                
摘要:思路 直接按照要求的走法可以建出一张 dag 图,发现就是跑一个最小路径覆盖,参见洛谷P2764,题解。 只需要用二分图匹配,每一次连接了一对匹配,相当于合并了两条路径(单个点也认为是路径),所以要让路径总数最小,就要让匹配的数量最大,由于是路径,所以每个点的入点和出点都最多只能连两条边。 代码 #
        阅读全文
                
摘要:思路 只需要用二分图匹配,每一次连接了一对匹配,相当于合并了两条路径(单个点也认为是路径),所以要让路径总数最小,就要让匹配的数量最大,由于是路径,所以每个点的入点和出点都最多只能连两条边。 代码 #include<bits/stdc++.h> using namespace std;typedef
        阅读全文
                
摘要:题目大意 给定 \(N\) 个长度为 \(L\) 的 01 匹配串 \(a\) 和 \(M\) 长度为 \(L\) 的 01 禁用串 \(b\),要求找到一个不是禁用串的长度为 \(L\) 的 01 字符串 \(c\),使得 \(\sum\limits_{i=1}^N\sum\limits_{j=1
        阅读全文
                
摘要:题目传送门 思路 一看就是构造题,显然要分成若干块 \(5\times5\) 的小块,然后发现对于一个小块中,只有最中间的那格可以从别的小块中一步跳进来。 然后我们打一个爆搜,打出从当前小块的中间走到各个方向相邻的小块的方案。 这样就可以在小块间移动了。 由于我们需要把所有的点都绕一遍,那么显然是在
        阅读全文
                
摘要:题目大意 给定 \(n\) 个主串和 \(m\) 个询问串。 对于每个询问串,求出最大的 \(l\),使得存在一种将当前询问串拆分成若干个长度 \(\ge l\) 且在任一主串中出现过的子串的方案。 思路 蒟蒻还是不会广义后缀自动机,所以我们就用 SA + st 表 + 二分 + 单调队列解决这道问
        阅读全文
                
摘要:思路 开始的时候想用倍增求 k 级祖先卡过去,然后就在考虑倍增数组 f[N][K],究竟是哪一维放在前面要快一点,所以都打了一下。 结果发现,一个会在 #9 TLE,另一个在 #8,#10 TLE,于是分成两类按照 \(2:1\) 的随机分布运行,然后就可以通过这道题了,最快用时:8.74s。 代码
        阅读全文
                
摘要:思路 蒟蒻不会 SAM,所以只好用 SA + Manacher + st 表 + set + 单调栈 + 双指针的笨重做法了。 首先处理出每个点为中心的最长回文串长度 \(odd_i\),以及以 \(i\) 和 \(i+1\) 为中心左右对称的最长回文串长度 \(evn_i\),这一步可以用 Man
        阅读全文
                
摘要:题目概述: 给你两个长度为 \(n\) 的字符串 \(a,b\),你需要找出 \(b\) 中有多少个不同的子串是 \(a\) 的子序列 思路: 可以枚举 \(a\) 中的子串,可是这样可能会有多个相同的子串被算了多次,那么,我们就可以用 \(Trie\) 树,然后从根节点开始向下搜,枚举每一个子串,
        阅读全文
                
摘要:这道题其实就是一个数位 \(dp\) 裸题,就是他这个前缀 \(0\) 有一点难处理,所以就多开一维就行了。 代码 #include<cstdio> #include<cstring> #define ll long long using namespace std; ll f[13][2][2][
        阅读全文
                
摘要:首先,我们可以贪心一下,把报废的时间按升序排序。 然后每到一个建筑,如果这个建筑可以修,那么就修了它。 如果不能修,那么就要看了,如果已经修了一个修筑时间大于当前不能修的建筑的修筑时间,那么显然是选当前这个好一点。 代码 #include<cstdio> #include<queue> #inclu
        阅读全文
                
摘要:一眼看去就感觉是数位 \(dp\) 弱化版 + 路径输出 用 \(f_{i,0/1,j}\) 表示在从低到高的第 \(i\) 位,填了 \(0/1\),之前填了 \(j\) 个 \(1\) 的个数。 转移方程式显然就是: f[i][0][j]=f[i-1][0][j]+f[i-1][1][j]; f
        阅读全文
                
 
                    
                     
                    
                 
                    
                
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号