贪心
1.直接去计算贡献
2.猜测贪心策略,并证明
证明方法:反证or直接设变量证
lamentropetion
---
展开
-
【贪心】牛客练习赛90 C
然后看,他让我们选一段子序列,注意到子序列内部无序,那其实就是子集,那就可以考虑排序贪心了。注意到贡献是长为 k 的段的贡献加起来的,一段的贡献是 max(0, sum - s)我们要求每个 k 的答案,k 已经是 1e6了,剩下的要不就O(1)要不O(logn)logn的话,考虑调和级数枚举(其实这个做法可以根据复杂度猜出来),那就是去枚举每段了。考虑从大到小排序就好了,其实就是从大到小选。肯定出发点是去考虑伤害的贡献。那就直接枚举每段算贡献即可。原创 2023-12-20 02:09:21 · 550 阅读 · 0 评论 -
【反悔贪心】2022ICPC南京 G
这里的做法是反悔贪心,先默认每次遇到0的时候合并,然后在遇到-1发现不够的时候反悔,把之前的合并变成加1即可。首先容易发现,合并操作对平均攻击力有贡献,但是加一个1就没有贡献,因此首先考虑每次遇到0的时候都合并。但是很快发现如果这样的话,遇到-1就不一定有足够的1给你合并,因此在遇到0的时候还得考虑后面够不够。但是现在反悔,先加1变成1 1 1,再合并变成 1 2。在反悔的时候,考虑维护的东西在反悔之前和之后的差值。这样 攻击力之和就 + 1, 个数也 + 1。原创 2023-10-24 20:32:03 · 173 阅读 · 0 评论 -
【换根DP】CF1882 D
然后就可以直接换根了,首先考虑树形DP,设dp[u] 为 把 u 子树染成同一种颜色的最小代价。首先观察到,先对儿子一定比先对父亲操作来的代价小,因此考虑先对儿子操作,再对父亲操作。那么根据刚刚的先操作儿子,转移方程为。然后换根就正常换就好了。原创 2023-10-21 16:20:41 · 179 阅读 · 0 评论 -
【枚举+贪心】CF1409 E
然后就能直接做了,枚举一个区间,然后找这个区间后缀的最大贡献的区间即可,所以需要维护一个后缀贡献的最大值。首先贪心的结论很明显,选两个贡献最大的区间。还有一个结论,这两个区间没有交点。原创 2023-09-23 01:06:47 · 257 阅读 · 0 评论 -
(典题)线段计数 CF690 div3 F
既然存在一条线段和其他所有线段相交,不知道是哪条线段,考虑枚举这条线段,然后计数没有交点的线段个数,取min。对于这个计数是个典,考虑将所有线段的端点扔进vec里,二分计算贡献即可。这题没什么性质可言,可以说就是纯纯的套路题。原创 2023-09-15 00:43:20 · 212 阅读 · 0 评论 -
【DS思想+堆贪心】CF595div3 D2
考虑nlogn做法,先去枚举点,然后把覆盖该点的所有区间扔进优先队列里,优先删除右端点靠右的。大家都说这是典,但是我不懂怎么个典法,可能堆贪心都是这样做的吗,不懂。那怎么看是不是坏点,还得维护一个差分数组,边枚举边维护。首先肯定要贪心,对于一个坏点,优先删除覆盖别的点多的。感觉突破点就是堆贪心。原创 2023-09-08 23:48:55 · 236 阅读 · 0 评论 -
【并查集+贪心】CF Edu152 D
首先观察样例可知,我们可以把连续的非0序列看作一个连通块,次数能够最少是因为同一个连通块的可以一次性染色。如果有2,那么连通块两端可以和0结合,如果没有2,可以选其中一端和0结合。贪心地从有2的连通块开始染色,再从普通连通块染色,然后剩下的的单独染即可。因为维护了左边第一个0和右边第一个0,注意要判一下边界。又观察到,一个连通块,有2和没2也是不一样的。原创 2023-09-01 21:27:05 · 205 阅读 · 0 评论 -
【反悔贪心】CF1278B CF11B
【代码】【反悔贪心】CF1278B CF11B。原创 2023-08-18 15:27:20 · 130 阅读 · 0 评论 -
【贪心+堆】CF1701 D
一开始想的是,把这些区间按右端点排序,然根据排序后的贪心。感觉这种带堆的贪心,都是取当前所有可行解中的最优解。原创 2023-08-17 01:05:53 · 123 阅读 · 0 评论 -
【贪心】CF1822 E
首先,回文对的字符种类一定是 >= 3的,除去那种两种字符且每种回文对的出现次数一样的情况。首先,n为奇数或有一种字符出现次数> n / 2就无解的结论是可以根据样例看出来的。那么这样匹配之后会有剩余的回文对,这些回文对一定是和另两种字符的反回文对匹配。因为这个出现次数最多的回文对的出现次数 <= s / 2,s是总的出现次数。剩余的这些回文对和前面匹配好的反回文对匹配就行,且一定足够消化这些回文对。那么前面匹配好的反回文对一定足以消化剩余的回文对。然后就显然的发现,每2个不同的回文对有1的贡献。原创 2023-08-16 22:33:19 · 152 阅读 · 0 评论 -
【贪心+二分】CF1791G2
按贡献 min(ai + i, ai + n - i + 1) 排序之后,我们发现,第一个传送门是什么不确定。我就想到了这里,这里我直接猜测第一个传送门一定是ai + i最小的那个,但是这个结论是错的。那么就回溯一下思路,思考一下一般情形,我们只需要枚举这个位置,然后把传送点个数取最大即可。首先,模拟一下样例发现,第一次传送之后,每次传送的贡献都是独立的,每次的贡献都是。那么直接在排序后的数组上操作即可,看最多延伸到这个数组的哪个长度。注意到这个长度具有单调性,当长度足够长时,钱就不够,足够短时钱够。原创 2023-08-16 15:21:32 · 94 阅读 · 0 评论 -
【贪心】CF1841 D
考虑一个大区间包含所有小区间的情形,这种情况就是在这么多区间中找出两个区间。n^2枚举所有区间对,每对区间合并成一个新区间,这个新区间就是一个连通块。换句话说,这么多区间组成一个连通块,在这个连通块中找出两个区间。问题就变成在这些新区间中找最多的不相交的区间的区间个数。这个就是典,把所有新区间按 r 排序,贪心地选即可。那么就去考虑特殊情况,看看有没有什么启发。一个连通块贡献出两个区间。问题转化成有多少连通块。原创 2023-08-15 19:56:34 · 150 阅读 · 0 评论 -
【贪心】CF1779 D
用pre数组记录这个数上次出现的最近位置,用st表判断是否为区间max。如果是,就统计这个元素需要被染色次数,然后比较颜料是否足够即可。难点在于,当一个区间的两端是区间max时,怎么去计算贡献。事实上,只需要考虑这个数上次出现的最近位置即可。还有一点细节就是,不能漏统计最后一段。然后考虑如何去计算贡献。原创 2023-08-15 17:06:42 · 106 阅读 · 0 评论 -
【二分+贪心】CF1622 C
考虑二分答案,我们去二分操作次数,那么问题就是,在操作mid次之内,能不能使它满足条件。首先,观察样例可知,肯定是把原本的最小值减到某个值,然后再复制几次。那把最小值减到哪个值是不确定的,考虑枚举这个值?一共有两种操作,他们分别占多少不确定,考虑枚举操作1的次数。注意二分的右边界,取pre[n] - k。复制的时候肯定是从大到小复制。原创 2023-08-12 11:20:53 · 203 阅读 · 0 评论 -
【二分+贪心】CF1665 C
我们可以结点按照兄弟的数量排序,然后优先感染兄弟多的结点.这样我们就知道了,第一秒被。个兄弟,所以我们扫描一遍就可以知道还剩下多少个兄弟结点还没被感染,判断能否用剩下的。但是可能会有别的分量更大(因为最后给最大的染色之后可能不再是最大的)一定用于优先感染兄弟结点比较多的结点,这样可以充分利用。只想到先感染大的分量,然后最后把最大的分量剩下的染色。可以用堆维护,但是这里用二分做法。的操作将这些结点感染即可.的结点剩下的时间里可以被。一开始想太简单wa6了。秒内能否感染所有结点.个兄弟,第二秒可以被。原创 2023-08-11 20:28:30 · 310 阅读 · 0 评论 -
【代码源每日一题div2 】简单的异或问题
所以,想在0~2^m-1里通过xor运算获得一个数a,就只用(2^m-1)和(2^m-1-a)进行xor运算即可,但这里要求的是最多能选多少数,我们可以把所有的数(除了目标a)都选上,真正有用的只有(2^m-1)和(2^m-1-a),至于其他的数经过运算后都会变成0.所以k能取到的最大值就是2^m-1。比如m=3时,一共是0 1 2 3 4 5 6 7,八个数,我们把他们首位组成一对,一共是4对:{0,7}{1,6}{2,5}{3,4}。原创 2023-08-05 16:58:03 · 147 阅读 · 0 评论 -
【贪心+01背包】Tower
因为交换相邻两个箱子只有对自身产生影响,所以可以贪心地考虑这两个箱子如何摆最优,而又因为本身上面的总重量不变,所以只用考虑这两个箱子的限制:一上一下的x,y,x 在上面还可放 sy−wx,y 在上可放 sx−wy,显然若 sy−wx>sx−wy 则 x 在上,否则 y 在上,移项一下得 sy+wy>sx+wx 则 x 在上,于是按 s+w 升序排序,然后每次都把箱子放在最下方即可。首先可以确定是个背包而且肯定要排序,但是根据什么排序不确定。原创 2023-08-01 23:53:03 · 245 阅读 · 0 评论 -
【长链剖分】icpc 2022西安 L
【代码】【长链剖分】icpc 2022西安 L。原创 2023-08-01 09:57:12 · 220 阅读 · 0 评论 -
【*2000 贪心】CF1763C
如果n=3,注意到我们可以把前两个变成一样的,然后所有数变成a[3],同理所有数可以变成a[1],几种情况讨论一下即可。如果n=2,那么要不操作要不不操作,答案就是max(a[1]+a[2],2*abs(a[2]-a[1])从n=3这个情况可以认识到,我们可以把所有数变成最大值,那么直接mx*N即可。如果n=1,那么直接输出a[1]即可。原创 2023-07-31 23:31:49 · 69 阅读 · 0 评论 -
【枚举+结论】icpc2022 济南 A
其实错误的思路都有个共同点,就是猜了结论之后没有去想为什么,在想为什么的过程其实就是pushup归纳的过程。然后,需要把贡献算出来之后再去排序,去掉排序后的m个大的,这里也有点问题,应该把贡献算出来了之后再去排序。考虑最后会变成什么数,手摸了几个发现,都是2,不论本来的集合是不是包含2。然后考虑去枚举最后变成什么数,猜测最后会变成集合中本来有的数,也wa2了。首先第一个,最后变成的数,一定是集合中某个数/2之后的值,这点需要观察到。然后要去掉m个,直接考虑去掉最大的m个。原创 2023-07-31 15:47:08 · 395 阅读 · 0 评论 -
【*1800树上贪心】CF1401 D
按照CF惯用套路,这样的n^2贡献肯定是更换枚举对象,我们去枚举边,按边算贡献。首先,1尽可能少,那就是让pi尽可能不合并地摊到所有边上,然后计算贡献。对于一条边的贡献应该为sz[u]*(N-sz[u])*p[i]然后就是贪心了,大的边权摊到经过次数多的边,小边权到次数小的边。同时需要分类讨论这些给定的质因子个数和边数的大小关系。原创 2023-07-26 19:44:22 · 100 阅读 · 0 评论 -
【贪心】CF1845 C
【代码】【贪心】CF1845 C。原创 2023-07-07 14:05:27 · 433 阅读 · 0 评论 -
【贪心+最小子段和】EDU151 D
因为当前缀和遇到最小子段时,前缀和会变小。然后变成K的一条直线,遇到上升的子段时再上升。首先K是1e18的范围,不能去枚举,那么就去考虑猜测结论。让K取最小子段和的左端点可以使变小的代价尽可能小。初步可以猜测,K应该取的是某个峰值。结论是,K应该取最小子段和的左端点。原创 2023-07-07 14:01:31 · 251 阅读 · 0 评论 -
【二维属性+贪心+双指针】Wannafly 挑战赛15 A
值得注意的是,我们说的双指针的单调性,指的是 j 指针前面所有元素都能满足 ai 以及 ai 以后这个条件。还是一样双指针把可行解放入DS中,然后求最优解。经典中的经典中的经典。原创 2023-07-06 17:55:00 · 95 阅读 · 0 评论 -
【贪心+推式子计算贡献】ABC216 E
因此可以考虑把ai从小到大排个序,然后从尾部遍历。贡献比较难推,但是手搓一下还是可以推出来的。如果不会几何模型,直接去手推找规律也可。首先,优先访问ai大的贡献一定大。先想出几何模型,再去手推。原创 2023-07-06 15:15:38 · 59 阅读 · 0 评论 -
【二维属性+贪心+双指针】ABC 195 D
经典中的经典,二维属性,对于其中的一个关键字排序,然后双指针将合法的可行解放入容器中,再去容器中找最优解,用双指针是因为它具有单调性。这里的最优解就是找出体积第一个>=它的,然后匹配。原创 2023-07-06 00:26:06 · 206 阅读 · 0 评论 -
【二维偏序+双指针】ABC245 E
这类双指针可以概括为:对于枚举的量(i),将合法解放入容器中,再在容器(合法解空间)中找最优解(这里可以贪心),满足的条件通常是二维偏序,一维来保证合法性,另一维来贪心获得最优解。对于这道题,我们可以以长度来check合法性,然后在合法解空间中找出最合适的,即找出第一个宽度>=物品的宽度的盒子,这个可以lower_bound来解决。在选盒子的过程中,注意到 j 具有单调性,因此我们可以双指针。因为两个数组都是无序的,因此可以考虑给这两个数组都排个序。我们可以先去枚举物品,然后去选对应的盒子。原创 2023-07-04 13:32:52 · 85 阅读 · 0 评论 -
【贪心+双指针】ABC308 F
对于每个物品,我们把合法的券扔进优先队列中,找到d最大的即可。注意到可以选的券具有单调性,可以用双指针维护。贪心结论就是,每次选合法的券中优惠最大的。因此我们可以把物品和券都排序。合法指本身的价格够上L值。原创 2023-07-02 17:58:04 · 119 阅读 · 0 评论 -
【贪心+双指针】阿宁睡大觉
那就是很经典的while(1)型的双指针了,很重要的一点是:要去掉前缀0区间和后缀0区间,这两个区间不能算进贡献里。首先有个很明显的结论:去掉2贡献要不变小要不不变,因此一定是去掉0。那么就是贪心,将连续0的区间长度排序,然后计算贡献。原创 2023-06-17 23:15:01 · 47 阅读 · 0 评论 -
【贪心】代码源每日一题div2 背包
然后考虑中间情况,前面的一些都是加起来<w/2的,然后如果突然加了一个物品,然后sum>w了,那么这个物品就是>w/2的,那么直接选这个物品就可以了,总体积就是>w/2,否则就不选这个物品,那么又变成第一种情况,如果选一个物品之后sum>w/2,那么就是YES。正解是把数组从大到小排个序,能选就选,看最后是不是>=w/2即可。如果每个物品都是>w,那么就是NO,我们不去考虑这种物品。因此NO的情况一定就是第一种或者情况,其他情况全是YES。如果所有物品加起来都<w/2,那么就是NO。原创 2023-06-14 20:25:31 · 32 阅读 · 0 评论 -
【贪心+权值线段树】代码源每日一题div1 双端队列
还有为了防止线段树越界,要和1取max,和N取min。手摸几个样例可以发现,不管怎么放,最小贡献是确定的。遍历数组,直接算两种决策的逆序对数的最小值就行了。因此可以直接计算最小贡献。原创 2023-06-12 00:28:33 · 120 阅读 · 1 评论 -
【按位贪心 代码源每日一题div1】Minimum Or Spanning Tree
怎么check呢,check函数里,问题就转化为:选一些边,使得不成环且或起来这位是0。对于这类按位贪心问题,一般考虑从高位往低位贪,然后check这位能不能是0/1。对于这道题,因为是最小,所以优先考虑这位能不能贪成0,然后去check。求最小的生成树,考虑按位贪心,即从高位往低位贪心。原创 2023-06-11 11:42:55 · 40 阅读 · 0 评论 -
【树上染色】ABC303E
若干菊花图连在一起,每个菊花图的中心之间的距离都是2。因此我们可以给这棵由菊花图构成的树编号,即进行染色。原创 2023-05-31 23:38:10 · 62 阅读 · 0 评论 -
【Tree树上染色+贪心】CF1387B1
当N为奇数时,对于多出来的三个点,三个之间交换即可。但其实也不难写,只需要树上染色然后维护答案就行了。事实上就是这么做的,但是看起来比较难写。当N为偶数时,其实就是相邻两个点交换。原创 2023-05-31 23:19:24 · 39 阅读 · 0 评论 -
【Tree+贪心】CF1336A
【代码】【Tree+贪心】CF1336A。原创 2023-05-30 18:06:45 · 33 阅读 · 0 评论 -
【结论+贡献+枚举+排列】CF1671D
结论是一步步搞出来的。原创 2023-05-30 00:52:41 · 57 阅读 · 0 评论 -
【反悔贪心+二分答案+枚举】Educational Codeforces Round 149 (Rated for Div. 2) F. Editorial for Two
那么,接下来就是看是否存在所有长度为K的子序列中分割成两部分的max(左,右)<=mid,即去看这个子序列的长度有没有K。给定一个长度为N的数列,问你所有长度为K的子序列中,将子序列分割成两部分,max(左半部分,右半部分)的最小值是多少。用堆预处理出前缀的子序列和后缀的子序列,然后枚举分割点就好了。最小化最大值,我们去二分这个最大值。关于子序列,这里用反悔贪心。原创 2023-05-26 18:47:59 · 86 阅读 · 0 评论 -
【树形DP】ABC259 F - Select Edges
如果状态设成dp[u][j]表示以u为根的子树,子树中选j条边的最大权值和 的话,会爆空间,因此树上背包是不可以的。因为儿子的顺序是无关紧要的,因此可以将儿子按贡献大小排序选,把最大权值和作为dp[u][1]的状态。注意到每条边都有选和不选两种决策,因此可以把决策放在状态里面。这里的贪心也有点难想到。边的状态可以转化到点里。原创 2023-05-25 17:17:36 · 99 阅读 · 0 评论 -
【贪心+构造】CF1806B
当mex=0的时候,应该是0 x 0 x ....这样子构造。给定一个长度为n的数列a,你可以重排这个数列。但是这样的前提是(N+1)/2>=cnt_0。当mex=1的时候,避免把0和1搞在一起就行。当所有数都是0的时候,mex=1。现在想问你怎么重排可以使得。就0 1 2这么猜过去。原创 2023-05-15 21:55:52 · 51 阅读 · 0 评论 -
【前缀和+反悔贪心】Hello2023 C. Least Prefix Sum
【代码】【前缀和+反悔贪心】Hello2023 C. Least Prefix Sum。原创 2023-05-11 23:25:42 · 56 阅读 · 0 评论