【学习笔记】NOIP暴零赛4
escape
当时没做出来确实挺脑瘫的。一直在想怎么把它划分成对答案有贡献和没贡献的两个集合,而忽略了直接从前往后贪心的做法。
首先如果规定每个人都必须出去的话,那么直接按 a i + b i a_i+b_i ai+bi排序,从前往后扫一遍即可。
然后我直接贪心。wa了,和答案差的很远,然后换成按
a
i
a_i
ai排序,恰好过了大样例。至此离正解越来越远出题人坑爹呢
我真傻,真的,应该想到有反悔操作的。还是按 a i + b i a_i+b_i ai+bi从小到大排序,然后从前往后扫,如果当前这个人能对答案产生贡献,那么直接贪心的把它加进去;否则可以把已经加进去的数中 a i a_i ai最大的那个替换出来,不难证明因为此时将 a i + b i a_i+b_i ai+bi用较大值去替换较小值所以一定是合法的。用大根堆维护即可。
怎么套路题都不会了
umi
原题是 「CF1209G2」Into Blocks (hard version)
作为一道数据结构题,个人认为它的思维量还是比较高的。
当然,我考场上并没有想到线段树,也没有口胡出正解,只想到了基于分治的单次 O ( n log n ) O(n\log n) O(nlogn)的做法,可惜的是并不能恰好解决带修改的情况。
正解非常脑洞 确实是这样的 。考虑
b
i
b_i
bi记录同时包含
i
i
i和
i
+
1
i+1
i+1的区间的个数,显然最后会分成若干个不相交的区间,那么我们找那些
b
i
=
0
b_i=0
bi=0的点,对于每一段连续的
0
0
0,从这一段
0
0
0的开头到前一段
0
0
0结尾的后一个位置构成了一个区间,这段区间的颜色出现次数最大值显然就是对答案的贡献。
这玩意显然只能想到用线段树维护。对于两个相邻的
0
0
0我们要算区间众数,这里有一个非常聪明的想法,因为这个众数肯定都落在
[
l
,
r
]
[l,r]
[l,r]这个区间内,那么我们可以把某个颜色的出现次数放在其最左边的那个位置上,这样就变成了单点修改,并且可以把之前打的标记覆盖掉,可以很好的解决众数出现次数减少的情况。看来数据结构也需要很聪明的想法呀
注意一个坑点,这里的 0 0 0要当作区间最小值来维护。
数据结构乃吾之弱项
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530028.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」