随笔分类 -  算法 - 贪心

摘要:开始想到了一个二分+主席树的 $O(n\log^2 n)$ 的做法. 能过,但是太无脑了. 看了一下题解,有一个 ST 表+堆的优美解法. 你发现肯定是选取前 k 大最优. 然后第一次选的话直接选固定左端点,最优的右端点就行. 但是呢,这个右端点选完后就不能再选了,于是你把这个区间分成两个,再扔到堆 阅读全文
posted @ 2019-11-26 16:29 EM-LGH 阅读(177) 评论(0) 推荐(0)
摘要:code: #include <bits/stdc++.h> #define N 100004 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; ll S; ll val[N],d 阅读全文
posted @ 2019-11-10 20:27 EM-LGH 阅读(154) 评论(0) 推荐(0)
摘要:我们发现正着枚举删除哪些叶子是错的,但是贪心枚举留下哪些却是对的. 我们枚举的时候需要动态查一个点到根有几个点没染色,和动态染色. 支持这些操作的数据结构非 LCT 莫属 code: #include <bits/stdc++.h> #define N 1000004 #define lson t[ 阅读全文
posted @ 2019-11-10 18:35 EM-LGH 阅读(119) 评论(0) 推荐(0)
摘要:题意: $mhy$ 住在一棵有 $n$ 个点的树的 $1$ 号结点上,每个结点上都有一个妹子。 $mhy$ 从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装 $zhx$ 牌杀毒软件,第 $i$ 个妹子安装时间为 $Ci$。 树上的每条边 $mhy$ 能且仅能走两次,每次耗费 阅读全文
posted @ 2019-11-02 15:35 EM-LGH 阅读(140) 评论(0) 推荐(0)
摘要:题意:在一款电脑游戏中,你需要打败 $n$ 只怪物(从 $1$ 到 $n$ 编号)。为了打败第 $i$ 只怪物,你需要消耗 $d[i]$ 点生命值,但怪物死后会掉落血药,使你恢复 $a[i]$ 点生命值。任何时候你的生命值都不能降到 $0$(或 $0$ 以下)。请问是否存在一种打怪顺序,使得你可以打 阅读全文
posted @ 2019-10-30 23:27 EM-LGH 阅读(151) 评论(0) 推荐(0)
摘要:题意:给定 $n$ 个括号序,让你从中选取一些括号序按照任意顺序拼接,最终生成一个合法的括号序列,求这个合法序列长度最大值. 题解:假设括号序列相对顺序固定,而我们要做的只是判断选还是不选的话可以转化为一个简单的背包问题: 令 $f[i][j]$ 表示考虑前 $i$ 个括号序,左括号比右括号多 $j 阅读全文
posted @ 2019-10-30 15:18 EM-LGH 阅读(198) 评论(0) 推荐(1)
摘要:第一次见到这个模型. 首先,不难得出砝码的种类不会超过 $log(10^9)$ 个,然后就不会分析了qaq... 那么,就说明一共只有 $30$ 多个本质不同的砝码. 考虑对每个背包进行状态的压缩:写成若干个砝码大小乘积的形式. 即 $v[i]=w[i]*a+w[i+1]*b+....$ 然后,将所 阅读全文
posted @ 2019-10-29 22:18 EM-LGH 阅读(127) 评论(0) 推荐(0)
摘要:如果没有限制,直接取前 $k$ 大即可. 有限制,则只有几种可能:奇换偶,偶换奇. 维护奇数偶数的前缀最小值和后缀最大值即可. code: 阅读全文
posted @ 2019-10-29 19:39 EM-LGH 阅读(126) 评论(0) 推荐(0)
摘要:这个真的好巧妙啊~ 如果只考虑点权的话显然直接按照权值大小排序即可. 但是加入了边权,就有了一个决策的问题. 于是,我们将边权分一半,分给两个端点. 如果一个人拿了两个端点,则边权都会加上. 否则,边权会抵消. 直接按照点权+一半边权排序即可. code: 阅读全文
posted @ 2019-10-29 18:44 EM-LGH 阅读(137) 评论(0) 推荐(0)
摘要:有一个小性质:就是一个下标排列的最小移动次数就是逆序对数. 我们发现最终形态一定是一个波峰. 那么我们求的就是形成波峰的下标最少逆序对数. 考虑将元素从小到大依次插入. 那么,对于第 $i$ 个元素,一定是放到左面或右面(就是从 1....left 或 right....n) 中的left和righ 阅读全文
posted @ 2019-10-29 16:32 EM-LGH 阅读(142) 评论(0) 推荐(0)
摘要:如果字符集无限大的话直接按照 $sa$ 的顺序依次填即可. 由于字符集非常小,所以要尽量填相同的字符. 我们知道 $sa$ 数组,也就知道了 $rank$ 数组. 那么考虑添加排名为 $i$ 的字符: 如果 $rank[sa[i-1]+1]>rank[sa[i]+1]$,说明 $sa[i]$ 的字典 阅读全文
posted @ 2019-10-28 16:58 EM-LGH 阅读(134) 评论(0) 推荐(0)
摘要:发现每一次切割都会使另一方向所有切割次数++. 而每一刀的代价就是 cost 切割次数,故贪心按照cost从大到小排序即可. cpp include define N 200000 define LL long long using namespace std; void setIO(string 阅读全文
posted @ 2019-10-28 16:39 EM-LGH 阅读(140) 评论(3) 推荐(0)
摘要:我感觉这道题挺神的~ 假设 $a[i]=b[i]$,那么我们可以将 $a$ 降序排序,然后你发现只要你按照 $1,3,5......n$ 这么取一定是合法的. 而我们发现 $2$ 比取 $3$ 优,取 $4$ 还比取 $5$ 优. 所以,我们可以这样: 强制性取第一个元素,然后其余 $\frac{n 阅读全文
posted @ 2019-10-22 16:27 EM-LGH 阅读(110) 评论(0) 推荐(0)
摘要:题意:给定一个环,环上有一些点包裹,你要从 $0$ 号点出发,然后每次带上一个容量为 $k$ 的背包. 问:如果要把所有的包裹都带回 $0$ 好点最少要走多少距离. 每一次只有 $3$ 种走法:走整圆,没走到半圆就返回(两个方向) 而我们可以贪心证明我们最多只会走一次整圆: 如果我们要走 $2$ 次 阅读全文
posted @ 2019-10-21 16:07 EM-LGH 阅读(191) 评论(0) 推荐(0)
摘要:题意:给定一棵树,树上有一些点是警察局,要求所有点到最近的警察局的距离不大于 $d$,求最多能删几条边 ? 题解: 考虑什么时候一条边可以被断开:这条边的两个端点被两个不同的警察局覆盖掉. 我们要设计一种染色方案,使得整棵树都被覆盖,且每个警察局覆盖的范围尽量小. 那么,我们可以使用 $BFS$ 算 阅读全文
posted @ 2019-10-03 11:29 EM-LGH 阅读(214) 评论(0) 推荐(0)
摘要:正确的贪心方法:按照比例排序. code: 阅读全文
posted @ 2019-10-01 09:01 EM-LGH 阅读(216) 评论(0) 推荐(0)
摘要:发现让 $b$ 更大的越靠前越优,然后依次决策将每个人分给哪个窗口. 令 $f[i][j]$ 表示考虑了前 $i$ 个人,且第一个窗口的总等待时间为 $j$ 的最小总时间. 然后转移一下就好了~ 阅读全文
posted @ 2019-09-25 15:39 EM-LGH 阅读(135) 评论(0) 推荐(0)
摘要:现在感觉还是挺好想的. Code: 阅读全文
posted @ 2019-09-23 16:17 EM-LGH 阅读(193) 评论(0) 推荐(0)
摘要:Code: 阅读全文
posted @ 2019-09-19 08:57 EM-LGH 阅读(156) 评论(0) 推荐(0)
摘要:Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值。 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值。 Input 第一行一个正整数N。 接下来 阅读全文
posted @ 2019-09-17 15:55 EM-LGH 阅读(154) 评论(0) 推荐(0)