
51 nod1686 第K大区间
预处理:首先,记录每个数在数组中的所有出现位置。 二分查找:设定一个函数 区间检查:对于每个数,找到其前x个出现位置,检查这些位置是否能构成一个满足条件的区间。 预处理:使用字典 二分查找:初始化 区间检查:对于每个数,找到其前
发布日期:2021-05-06 23:50:36
浏览次数:17
分类:精选文章
本文共 2077 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到所有区间的众数出现次数,并将这些值排序后,找到第K大的值。直接暴力枚举所有区间显然不可行,因此我们采用二分查找的方法来优化解决方案。
方法思路
f(x)
,用于判断是否存在一个区间,其众数出现次数至少为x。通过二分查找,我们可以快速确定最大的x值。解决代码
import sysfrom collections import defaultdictdef main(): n, k = map(int, sys.stdin.readline().split()) a = [0] * (n + 1) for i in range(1, n+1): a[i] = int(sys.stdin.readline()) # 预处理每个数的位置列表 pos = defaultdict(list) for i in range(1, n+1): num = a[i] pos[num].append(i) # 二分查找 left = 1 right = n best = 0 while left <= right: mid = (left + right) // 2 # 检查是否存在一个区间,其众数出现次数 >= mid found = False for num in pos: lst = pos[num] m = len(lst) if m < mid: continue # 找前 'mid' 个位置,并检查是否存在一个区间满足条件 count = mid start = 0 max_gap = 0 for i in range(len(lst)): if i >= mid: break current = lst[i] # 找到current的左边最近的位置 left_pos = current - 1 while left_pos >= 0 and (left_pos + 1) != current: left_pos -= 1 if left_pos < 0: left_pos = 0 left_gap = current - (left_pos + 1) right_gap = (lst[i+1] - 1) - current gap = max(left_gap, right_gap) if gap > max_gap: max_gap = gap # 计算在这个区间内,是否有其他数的出现次数超过mid # 这里可能需要进一步优化 if max_gap < mid: # 这个数的前mid个位置间隔足够,可能构成一个区间 found = True break if found: best = mid left = mid + 1 else: right = mid - 1 print(best)if __name__ == "__main__": main()
代码解释
pos
记录每个数的所有出现位置。left
和right
为1和n,通过二分查找确定最大的mid
值。mid
个出现位置,计算这些位置之间的最大间隔。如果最大间隔大于mid
,则存在满足条件的区间。通过这种方法,我们可以高效地找到所有区间的众数出现次数,并确定第K大的值。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月10日 16时52分55秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
L - Large Division (大数, 同余)
2019-03-06
39. Combination Sum
2019-03-06
41. First Missing Positive
2019-03-06
80. Remove Duplicates from Sorted Array II
2019-03-06
83. Remove Duplicates from Sorted List
2019-03-06
410. Split Array Largest Sum
2019-03-06
开源项目在闲鱼、b 站上被倒卖?这是什么骚操作?
2019-03-06
Vue3发布半年我不学,摸鱼爽歪歪,哎~就是玩儿
2019-03-06
《实战java高并发程序设计》源码整理及读书笔记
2019-03-06
Java开源博客My-Blog(SpringBoot+Docker)系列文章
2019-03-06
程序员视角:鹿晗公布恋情是如何把微博搞炸的?
2019-03-06
【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?
2019-03-06
Linux应用-线程操作
2019-03-06
多态体验,和探索爷爷类指针的多态性
2019-03-06
系统编程-进程间通信-无名管道
2019-03-06
记2020年初对SimpleGUI源码的阅读成果
2019-03-06
C语言实现面向对象方法学的GLib、GObject-初体验
2019-03-06
系统编程-进程-ps命令、进程调度、优先级翻转、进程状态
2019-03-06