随笔分类 -  动态规划

摘要:Description 给定一颗 N 个点的树,树上的每个点或者是红色,或者是黑色。 每个单位时间内,你可以任选两个点,交换它们的颜色。 出于某种恶趣味,你希望用最少的时间调整结点的颜色,使得对于每个点,离它最近的黑色点与它的距离不超过 x。 Input 输入的第一行包含整数 N 和 x(1 <= 阅读全文
posted @ 2020-01-02 09:25 EM-LGH 阅读(138) 评论(0) 推荐(0)
摘要:这个状态的定义非常难想吧... $f[x][y]$ 表示以 $x$ 为根的子树中,其余点全部移到了应该移动到的位置,也建设了应该建设的仓库,而 $x$ 移动到 $y$ 的最小代价. 这里是事前钦定 $y$ 不建立仓库的. 那么,我们考虑如何从 $x$ 的儿子转移到 $x$: 若 $f[son][b] 阅读全文
posted @ 2020-01-01 09:14 EM-LGH 阅读(193) 评论(0) 推荐(0)
摘要:就是喜欢后缀自动机,yy了一个只用后缀自动机解决的方法. 对 3 个串建立广义后缀自动机,然后建立后缀树. 标记出每个点在0/1/2个串中是否作为子串出现,然后将后缀树中 2 串结尾的所有子树都设为危险节点. 然后对于 SAM 来一个拓扑序DP,我们开始的时候默认危险节点的最大值是 -inf,然后 阅读全文
posted @ 2019-12-31 08:52 EM-LGH 阅读(187) 评论(0) 推荐(0)
摘要:和【洛谷5115】挺像的. 都是统计信息的时候是包含两个树的,那就在一个树上边分治,另一个树上跑一个虚树dp就好了. 式子这么拆: $dep[i]+dep[j]-(dep[LCA(i,j)]+dep'[LCA'(i,j)]$ $\Rightarrow dep[i]+dep[j]-\frac{1}{2 阅读全文
posted @ 2019-12-28 14:25 EM-LGH 阅读(149) 评论(0) 推荐(0)
摘要:800年没写DP了,一个傻逼题调半天. code: #include <cstdio> #include <cstring> #include <algorithm> #define N 504 #define inf -10000 #define setIO(s) freopen(s".in"," 阅读全文
posted @ 2019-12-26 20:34 EM-LGH 阅读(112) 评论(0) 推荐(0)
摘要:大体上的思路不算太难,但是细节巨多无比. 注意我们必须要选一个,所以在记录极差的同时还要记录一下上一次出现的位置. code: #include <cstdio> #include <algorithm> #define setIO(s) freopen(s".in","r",stdin) usin 阅读全文
posted @ 2019-12-25 20:54 EM-LGH 阅读(203) 评论(0) 推荐(0)
摘要:非常有趣的一道题.... code: #include <cstdio> #include <string> #include <algorithm> using namespace std; namespace IO { void setIO(string s) { string in=s+".i 阅读全文
posted @ 2019-12-25 14:59 EM-LGH 阅读(166) 评论(0) 推荐(0)
摘要:code: #include <cstdio> #include <string> #include <algorithm> #define N 500005 #define inf 0.0000000001 using namespace std; namespace IO { void setI 阅读全文
posted @ 2019-12-25 09:35 EM-LGH 阅读(138) 评论(0) 推荐(0)
摘要:这个题的思路非常好啊. 我们可以把 $k$ 个点拿出来,那么就是求将 $k$ 个点划分成不大于 $m$ 个集合的方案数. 令 $f[i][j]$ 表示将前 $i$ 个点划分到 $j$ 个集合中的方案数. 那么有 $f[i][j]=f[i-1][j-1]+f[i-1][j]*(j-fail[i])$, 阅读全文
posted @ 2019-12-24 13:37 EM-LGH 阅读(146) 评论(0) 推荐(0)
摘要:思路不难,但是细节还是挺多的,要格外注意一下. code: #include <cstdio> #include <queue> #include <cstring> #include <algorithm> #define N 2005 #define ll long long #define m 阅读全文
posted @ 2019-12-23 20:43 EM-LGH 阅读(200) 评论(0) 推荐(0)
摘要:好神啊 ~ 打表程序: #include <cstdio> #include <cstring> #include <algorithm> #define N 140000000 #define ll long long #define mod 998244353 #define setIO(s) 阅读全文
posted @ 2019-12-19 14:07 EM-LGH 阅读(136) 评论(0) 推荐(0)
摘要:十分有趣的问题. 我们发现如果拿的话肯定要先拿一些大的. 所以我们可以先将所有数从小到大排序,令 $f[i]$ 表示拿完前 $i$ 小先手-后手的最大值. 则有转移:$f[i]=max(f[i-1],a[i]-f[i-1])$ 反复阅读:每次拿一些数字的贡献是这些数字中最小的值. 反复阅读上一句话, 阅读全文
posted @ 2019-12-17 20:50 EM-LGH 阅读(184) 评论(0) 推荐(0)
摘要:思路很巧妙的一道题 ~ 这个应该不完全是正解,复杂度约为 $O(3\times 10^8)$,有时间再研究研究正解. 首先,最裸的暴力是按照权值从小到大枚举每一个数,然后枚举后面的数来更新方案数,是 $O(n^2)$ 的. 然后,我们可以用lucas定理来模拟那个组合数,会发现只需满足大数&小数=小 阅读全文
posted @ 2019-12-17 16:20 EM-LGH 阅读(245) 评论(0) 推荐(0)
摘要:自己 yy 了一个动态 dp 做法,应该是全网唯一用 LCT 写的. code: #include <bits/stdc++.h> #define ll long long #define lson tr[x].ch[0] #define rson tr[x].ch[1] #define setIO 阅读全文
posted @ 2019-12-05 20:25 EM-LGH 阅读(183) 评论(0) 推荐(0)
摘要:挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 $\sqrt 500$ 的质因子(两个的话乘积就超过 500 了) 而不大于 $\sqrt 500$ 阅读全文
posted @ 2019-12-02 20:59 EM-LGH 阅读(181) 评论(0) 推荐(0)
摘要:这个和 bzoj 5469 几乎是同一道题,但是这里给出另一种做法. 你发现你要求的是一个树上 LIS,而序列上的 LIS 有一个特别神奇的 $O(n\log n) $ 做法. 就是维护一个单调递增的栈,如果发现新加元素大于栈顶,则直接加入,否则在序列中二分出一个大于等于该元素的最小值,然后替换掉. 阅读全文
posted @ 2019-12-02 18:25 EM-LGH 阅读(158) 评论(0) 推荐(0)
摘要:在 dp 问题中,如果发现可以用后缀最大值来进行转移的话可以考虑去查分这个后缀最大值. 这样的话可以用差分的方式来方便地进行维护 ~ #include <bits/stdc++.h> #define N 200007 #define ll long long #define lson t[x].ls 阅读全文
posted @ 2019-12-02 16:25 EM-LGH 阅读(172) 评论(0) 推荐(0)
摘要:标签:树形dp,枚举,树的直径 一上来看到这个题就慌了,只想到了 $O(n^3)$ 的做法. 碰到这种题时要一步一步冷静地去分析,观察数据范围. 首先,$n\leqslant 5000$,所以可以先 $O(n)$ 枚举切断哪条边. 而如果暴力枚举连哪条边的话时间就是爆炸的,不妨冷静地分类讨论一下. 阅读全文
posted @ 2019-12-02 10:36 EM-LGH 阅读(149) 评论(0) 推荐(0)
摘要:code: #include <bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in","r",stdin) const int N=200006; const double eps=1e-6; const double 阅读全文
posted @ 2019-11-29 18:39 EM-LGH 阅读(160) 评论(0) 推荐(0)
摘要:一定要注意要乘阶乘,细节很多. code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; const int N=2007; 阅读全文
posted @ 2019-11-29 08:43 EM-LGH 阅读(136) 评论(0) 推荐(0)