随笔分类 -  算法-贪心

摘要:Kruskal 算法。考虑哪些边有可能被贪心选中。因为最小公倍数的要求太复杂、太苛刻,我们不妨忽略“最小”,只考虑是公倍数。因为这样新产生的边边权更大,不会影响答案。考虑点权是 k 的倍数的点之间的边,发现有用的边其中一个端点一定是大于等于 L 的第一个 k 的倍数。于是有用的总边数就被压缩到了 O(n log n) 级别。直接执行 kruskal 算法即可。此外,我们还可以不事先排序,用 priority_queue 把空间复杂度优化到 O(n)。 阅读全文
posted @ 2022-04-10 18:15 duyiblue 阅读(258) 评论(2) 推荐(1) 编辑
摘要:分析题目性质,找出一些最基本的贪心策略(比如把 B 从小到大排序)。然后枚举总共获得了几个协作者,这样就能知道每个仅获得选票的州的用时,进而可以 DP。朴素的 DP 是 O(N^3) 的,总时间复杂度 O(N^4)。进一步观察问题特性后,可以把 DP 优化到 O(n^2)。 阅读全文
posted @ 2022-02-26 16:56 duyiblue 阅读(505) 评论(2) 推荐(3) 编辑
摘要:首先把问题转化为:有一个给定的数组 b[1...n],一个数 x,使得所有 (b[i] + x) 的二进制里 1 的个数之和最小。从低到高逐位 DP,发现要考虑上一位有没有进位,那么状态数是 2^n 的。进一步观察,因为每个数加的 x 是一样的,所以在这些低位上原数值越大,越有可能进位。所以状态里只需要记录有多少个数进位,然后把序列排个序,就知道具体是哪些数进位了 阅读全文
posted @ 2021-03-25 23:12 duyiblue 阅读(221) 评论(0) 推荐(0) 编辑
摘要:本文提供了两种解法。一种是硬核数据结构做法。将限制转化为一个几何问题(双矩形的交),用扫描线求解。第二种是巧妙的贪心,证明了如何选择 n1, n2 是最有可能有解的,于是在确定 n1, n2 后,直接进行二分图染色即可 阅读全文
posted @ 2021-03-16 17:37 duyiblue 阅读(210) 评论(1) 推荐(1) 编辑
摘要:很神的数据结构题!!!先做前缀和等初步转化,可以变成关于两个序列、区间最大、最小值的问题。枚举 r,用单调栈维护出使其中一个序列合法所需要做的操作。对另一个序列,可以贪心地在区间端点处进行操作。找出最小的、合法的区间端点,可以在线段树上二分。但这个线段树维护的信息比较特殊,要用到类似于《楼房重建》这题里,log^2 线段树的技巧。 阅读全文
posted @ 2021-01-05 14:30 duyiblue 阅读(358) 评论(7) 推荐(3) 编辑
摘要:首先发现每个字母会对答案有一个贡献系数,是 1 或 -1。结论是,除了 n 的系数必须是 1,n - 1 的系数必须是 -1,其他数的系数可以任意选择。于是问题转化为选择系数,使得和为 T。可以从大到小贪心。本文将证明其正确性。 阅读全文
posted @ 2020-12-24 14:16 duyiblue 阅读(334) 评论(1) 推荐(2) 编辑
该文被密码保护。
posted @ 2020-12-09 06:55 duyiblue 阅读(6) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-09-14 00:27 duyiblue 阅读(54) 评论(0) 推荐(0) 编辑
摘要:m=n-1时一定有解,策略是取最小的和最大的原材料拼成一道菜,然后转化为m,n分别小1的子问题递归下去。m>=n时,可以先取最大的原材料,直到m=n-1。m=n-2时,用DP将所有原材料,划分成两个m=n-1的集合。DP的状态设计比较巧妙,同时需要用到bitset优化 阅读全文
posted @ 2020-08-26 11:31 duyiblue 阅读(304) 评论(0) 推荐(0) 编辑
摘要:如果已经知道结果串t,考虑s能不能得到t,可以做一个贪心“匹配”。知道这个贪心的策略后,考虑本题要计算所有t的数量,那么可以DP。设dp[i]表示有多少t能贪心匹配到s的前i位。转移时考虑t的下一位是1还是0即可。 阅读全文
posted @ 2020-07-25 13:47 duyiblue 阅读(445) 评论(0) 推荐(0) 编辑
摘要:把一个排列看成若干个环(i连向p[i])。每次操作,相当于拆掉一个环,或者合并两个环。把所有环,分成同色环和非同色环两类。非同色环,总能用环长-1次操作消掉。同色环可以和别的环合并,变成非同色环。这个过程需要贪心:每次合并两个出现次数最多的颜色的同色环。 阅读全文
posted @ 2020-07-14 19:46 duyiblue 阅读(332) 评论(0) 推荐(0) 编辑
摘要:D是贪心。难点在于把树的形态和生成方法搞明白。E也是贪心,思路是从边界入手,考虑什么人能被放到最后,然后把这些删掉,继续考虑即可。F是个博弈题,而且是多轮游戏,这比较特别,但处理的方法也是个套路,算是学到了。重点还是在于搞清楚单轮游戏,什么情况下能赢,什么情况下能输。需要仔细的分析。 阅读全文
posted @ 2020-06-24 14:41 duyiblue 阅读(506) 评论(0) 推荐(2) 编辑
摘要:选入了一些比较简单的题。太偏的和太难的,就不放进来啦~ 阅读全文
posted @ 2020-05-26 17:30 duyiblue 阅读(680) 评论(1) 推荐(1) 编辑
摘要:先将整个串划分为,尽可能少的、L,R交替的子序列,再将这些子序列拼起来。划分可以直接贪心,从左向右依次加入每个字符,没有能加入的子序列,就新开一个子序列。划分好后,构造拼接方案。将子序列分为LL,RR,LR,RL四类。LL,RR这两类可以先合并为一个LL,或一个RR,或一个LR。LR,RL这两类,可以合并为一个LR或一个RL。最后将剩下的不超过两个子序列拼接在一起即可。 阅读全文
posted @ 2020-05-25 19:21 duyiblue 阅读(349) 评论(1) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-05-20 15:44 duyiblue 阅读(6) 评论(0) 推荐(0) 编辑
摘要:通过二分答案转化为判定性问题。发现如果从前往后安排每一天,很难找到一种固定的贪心策略,来确定当天砍哪些竹子。换个思路,时光倒流!从后往前,每天竹子自己减少ai,我们一次操作将其拔高p。要保证每根竹子高度始终非负,且m天后最终高度大于等于hi。用小根堆维护每根竹子自己能坚持到哪一天(不变成负数),每次取出坚持天数最少的,将其拔高即可 阅读全文
posted @ 2020-05-18 09:03 duyiblue 阅读(442) 评论(8) 推荐(0) 编辑
摘要:把序列中的数,分为:小于k的,等于k的,和大于k的,三类。我们要使得序列里所有数,排好序后,中间位置的值刚好是k。分大于k的数太多,和小于k的数太多,两种情况。如果大于k的数太多,则通过每次对相邻两个数操作,能恰好消灭掉一个大于k的数,因此这种情况一定有解。如果小于k的数太多,我们需要找到一段区间,满足区间长度至少为2且区间里大于等于k的数占绝对多数。 阅读全文
posted @ 2020-05-13 11:37 duyiblue 阅读(320) 评论(0) 推荐(0) 编辑
摘要:[toc] "比赛链接" CF1348D Phoenix and Science 分析问题的性质。首先,每块的大小是无关紧要的,重要的是你每天会切多少块。这取决于两个因素:当前已有的块数$d$,当前所有块的总和$w$。假设你今天要新切$x$刀,那么显然,$i$必须满足:$0\leq x\leq d$ 阅读全文
posted @ 2020-05-08 18:34 duyiblue 阅读(266) 评论(0) 推荐(0) 编辑
摘要:如果$\lfloor\frac{i}{k}\rfloor\neq 0$,就从$i$向$\lfloor\frac{i}{k}\rfloor$连边,则可以得到一个森林。问题转化为:给森林里每个节点安排一个点权,在保证后代的点权$\geq$祖先点权的前提下,使按编号排列时的字典序最大。 把所有权值按从小到 阅读全文
posted @ 2020-04-24 18:11 duyiblue 阅读(154) 评论(0) 推荐(0) 编辑
摘要:比赛链接 CF1340A Nastya and Strange Generator 如题目所定义地,我们设$r_j$表示$\geq j$的位置中,第一个没有被占用的位置。特别地,我们认为位置$n+1$永远不被占用。即:如果$[j,n]$都已经被占用了,那么$r_j=n+1$。 题目还定义了,\(\t 阅读全文
posted @ 2020-04-24 14:43 duyiblue 阅读(741) 评论(0) 推荐(0) 编辑