Codeforces贪心训练

本文深入解析CF平台上的经典算法题目,涵盖字典树、贪心策略、贡献法等核心概念,通过实例阐述如何高效解决复杂问题,是算法学习者的宝贵资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心跟个sb一样…
来cf刷几个题玩玩
注意一下**表示还要再来玩一次的

717B. R3D3’s Summer Adventure

每次拓展一个点,即从上一个最优情况来到下一个最优情况

目标就是让你建出一个字典树,满足有nnn个叶子节点且叶子节点权最小
这里的贪心我们需要考虑的是每次拓展一个点,即从上一个最优情况来到下一个最优情况
听说这种拓展还有个名字叫VarnCodeTreeVarn Code TreeVarnCodeTree
考虑每次找到一个最小权的叶子节点iii,设他的权为ccc
显然可以知道的是每次我们一定会扩展出来两个叶子节点,因为只扩展一个显然没有左右
故每次会多出两个权为c+c1c+c1c+c1c+c2c+c2c+c2的叶子节点
模拟n−1n-1n1次不难得到一个nlognnlognnlogn的做法
考虑如何加速这个过程,我们发现在权值相同的时候显然是可以同时拓展一些叶子节点。设f[i]f[i]f[i]表示权值为iii的叶子节点个数,则每次取出最小的开始拓展。注意到每次节点个数的增长类似于斐波那契数列,故复杂度可以通过
注意特判掉存在某个ccc000的情况

**538H. Summer Dichotomy

贪心考虑答案的最终位置的性质

这个题搞完了之后还是迷迷糊糊的…
可能变得不naive一点之后会再来搞一次?
这题的套路是贪心考虑答案的最终位置的性质
在不考虑t1,t2t1,t2t1,t2的限制下,不妨设存在一组解n1n1n1n2n2n2
满足n1&gt;max(li)n1&gt;max(l_i)n1>max(li)n2&lt;min(ri)n2&lt;min(r_i)n2<min(ri)
显然可以发现,如果出现了这种情况,我们总能往左移动n1n1n1同时往右移动n2n2n2
一定能使得两个点都贴上边界并且答案仍然合法
所以不妨设n1=max(li),n2=min(ri)n1=max(l_i),n2=min(r_i)n1=max(li),n2=min(ri)
此时n1n1n1需要向右移动,n2n2n2需要向左移动
如果多出了t1,t2t1,t2t1,t2的限制,我们发现,在n1,n2n1,n2n1,n2向左与向右移动(即初始情况不满足限制)的时候,一定能够使得一个点贴上了t1t1t1或者t2t2t2的边界。并且使得答案仍然成立
故我们定值之后再对n1,n2n1,n2n1,n2取边界值。然后二分图染色判定即可

1097E. Egor and an RPG game

贪心考虑不同决策时对答案的影响

其实大概想了一下如果每次贪心选最长上升或者下降序列…
因为不会求复杂度就跑了2333…可能以后写一下我这个做法?
题解做法很巧妙,用到了我忽略的fff数组
先抛出结论,设kkk为满足max(k∗(k+1)2&lt;=n)max(\frac{k*(k+1)}{2}&lt;=n)max(2k(k+1)<=n)的数,则f[n]=kf[n]=kf[n]=k
考虑归纳证明
对一个长度为nnn的序列,先求出其LISLISLIS
如果长度&gt;K&gt;K>K,贪心的将其删除然后递归向下完成
注意到他减去了之后合法的KKK一定不会大于k∗(k−1)2\frac{k*(k-1)}{2}2k(k1),故对于剩下来的nnn是合法的
否则,我们根据LISLISLIS的结果构造下降序列
对于LISLISLIS数组g[i]g[i]g[i]同值的,我们将其放到同一组。显然同组中数不递增,故可以用≤K\leq KK的次数构造完成这个序列
实现模拟上述过程即可
复杂度是非常不满的nnlog⁡nn\sqrt n\log nnnlogn

533A. Berland Miners

贡献 !贡献!贡献!

转化的有点慢了…
权值离散,预处理每个点到根上的最大值和次大值
注意这种匹配的题一般都是把两个序列归为一个序列,然后一个设为+1+1+1另一个设为−1-11,考虑后缀和不小于000的问题
那么用线段树维护一下最小的后缀值就可以快速判合法,问题在于现在是怎么移动
用一个小小的贪心
从后往前找到第一个后缀和小于000的位置xxx,显然我们需要增大的那个点就是要增大到xxx
增加少了没有作用,增加大了没有贡献
故剩余直接模拟上述过程即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值