第十四届蓝桥杯第三次模拟——复盘
创始人
2024-05-29 07:05:05
0

第三次模拟延续了前两次模拟的一贯风格(水的一批 ),虽然都不难,还是有几道还行的题目,下面讲解最后一题,以此来复习一下前面学过的知识

问题描述:

小蓝有一个序列a[1],a[2],…,a[n]。给定一个正整数k,请问对于每一个1到n之间的序号i.a[i-k],a[i-k+1]…a[i+K]
这2k+1个数中的最小值是多少?当某个下标超过1到n的范围时,数不存在,求最小值时只取存在的那些值。

输入格式:

输入的第一行包含一整数n。 第二行包含n个整数,分别表示 a[1],a[2],…,a[n]。 第三行包含一个整数k

输出格式:

输出一行,包含n个整数,分别表示对于每个字号求得的最小值

样例输入:

5
5 2 7 4 3
1

样例输出:

2 2 2 3 3

评测用例规模与约定

对于 30% 的评测用例,1 <= n <= 1000,1 <= a[i] <= 1000。
对于 50% 的评测用例,1 <= n <= 10000,1 <= a[i] <= 10000。
对于所有评测用例,1 <= n <= 1000000,1 <= a[i] <= 1000000

思路1:树状数组

首先说树状数组
先挖掘一下题意,遍历序列,对于遍历的元素的一段区间,求最值。随着遍历的进行,区间内的元素在变化,也就是说要修改元素,对于区间最值,我们可以使用二分的方法来查找。
具体的做法是,维护一个关于当前遍历的元素一定大小区间(2k + 1)记录数值的树状数组。每一次遍历通过二分查找,查找这段区间数值的最小值。

代码

N = 100010tr = [0] * N
a = [0] * Ndef lowbit(x) : return x & -xdef add(x, c) :i = xwhile i <= n :tr[i] += ci += lowbit(i)def ask(x) :res = 0i = xwhile i :res += tr[i]i -= lowbit(i)return resdef init() : # 初始化,将第一个元素右边的m个元素初始化树状数组for i in range(1, m + 1) :add(a[i], 1)n = int(input())
a[1 : n + 1] = list(map(int, input().split()))
maxn = max(a[1 : n + 1])
m = int(input())
init()
for i in range(1, n + 1) : if i + m <= n : # 随着区间的挪动添加元素add(a[i + m], 1)if i - m - 1 >= 1 : # # 随着区间的挪动删除元素add(a[i - m - 1], -1)l, r = 0, maxn # 二分查找,右半段查找最小值while l < r :mid = (l + r) >> 1if ask(mid) >= 1 :r = midelse :l = mid + 1print(l, end = " ")

思路2:滑动窗口

通过上面的描述,显然说的就是滑动窗口啊。
维护一个窗口大小为2 * k + 1的单调递减队列即可。

代码

N = 1000010a = [0] * N
q = [0] * Nn = int(input())a[1 : n + 1] = list(map(int, input().split()))m = int(input())hh, tt = 0, -1def init() : # 初始化,将前m个进队列,这时只需要保持单调性即可global ttfor i in range(1, m + 1) :while hh <= tt and a[q[tt]] >= a[i] :tt -= 1tt += 1q[tt] = i
init()for i in range(m + 1, n + m + 1) :while hh <= tt and i - q[hh] + 1 > 2 * m + 1 :hh -= 1if i <= n : # 防止序列越界while hh <= tt and a[q[tt]] >= a[i] :tt -= 1tt += 1q[tt] = iprint(a[q[hh]], end = " ")

思路3:线段树

思路同树状数组,区间查询。

N = 1000010class Tree :def __init__(self) :self.l = 0self.r = 0self.v = 0tr = [Tree() for _ in range(N * 4)]
a = [0] * Ndef pushup(u) :tr[u].v = min(tr[u << 1].v, tr[u << 1 | 1].v)def build(u, l, r) :tr[u].l, tr[u].r = l, rif l == r :tr[u].v = a[l]returnmid = l + r >> 1build(u << 1, l, mid)build(u << 1 | 1, mid + 1, r)pushup(u)def query(u, l, r) :if l <= tr[u].l and tr[u].r <= r :return tr[u].vres = 10000010mid = tr[u].l + tr[u].r >> 1if l <= mid :res = query(u << 1, l, r)if r > mid :res = min(res, query(u << 1 | 1, l, r))return resn = int(input())a[1 : n + 1] = list(map(int, input().split()))m = int(input())
build(1, 1, n)for i in range(1, n + 1) :l, r = max(1, i - m), min(i + m, n)print(query(1, l, r), end = " ")

思路4:RMQ

from math import logN = 1000010a = [0] * N
f = [[1000010] * 25 for _ in range(N)]n = int(input())a[1 : n + 1] = list(map(int, input().split()))
m = int(input())def init() : # 预处理st表for i in range(1, n + 1) :f[i][0] = a[i]k = int(log(n, 2)) + 1for length in range(1, k) :for l in range(1, n + 1) :r = l + (1 << length) - 1if r > n : breakf[l][length] = min(f[l][length - 1], f[l + (1 << (length - 1))][length - 1])def query(l, r) :k = int(log(r - l + 1, 2))return min(f[l][k], f[r - (1 << k) + 1][k])init()for i in range(1, n + 1) :l, r = max(1, i - m), min(i + m, n)print(query(l, r), end = " ")

相关内容

热门资讯

安卓系统的总体框架,架构与核心... 你有没有想过,你的手机里那个神奇的安卓系统,它到底是怎么运作的呢?今天,就让我带你一探究竟,揭开安卓...
谁的安卓系统好,谁家的安卓系统... 说到安卓系统,这可是个热门话题呢!你有没有想过,这么多安卓手机品牌,哪个的操作系统最让你心动?今天,...
安卓系统信付通,安全无忧的移动... 你知道吗?在安卓手机的世界里,有一个超级好用的支付工具,它就是信付通。今天,就让我带你来全方位了解一...
小米官方系统安卓包,深度解析与... 亲爱的数码爱好者们,你是否曾为手机系统而烦恼?市面上那么多手机品牌,各种操作系统让人眼花缭乱。今天,...
自制安卓手机双系统,自制安卓手... 你有没有想过,自己的手机可以同时运行两个操作系统呢?没错,就是那种安卓手机双系统!听起来是不是很酷?...
小米安卓系统怎么设置,科技前沿... 小米手机的用户们,是不是觉得安卓系统有点复杂,设置起来有点头疼呢?别担心,今天就来手把手教你如何轻松...
点歌系统支持安卓系统么,安卓用... 你有没有想过,在手机上点歌听歌,是不是也能像在KTV里那样随心所欲呢?现在,就让我来告诉你一个超级酷...
原版安卓系统刷机,解锁无限可能 你有没有想过,你的安卓手机其实可以焕然一新?没错,就是那种原汁原味的安卓系统,让你的手机重新找回当初...
欧尚改装安卓系统,打造智能驾驶... 你有没有想过,你的欧尚汽车其实也可以变身成为智能座驾呢?没错,就是那个你每天上下班的伙伴——欧尚,现...
安卓系统最新事件,揭秘最新重大... 你知道吗?最近安卓系统可是发生了一件超级大事件,简直让人兴奋得心跳加速!这不,我就迫不及待地来和你分...
早期电话手表安卓系统,安卓系统... 你有没有想过,小时候那些看似简单的玩具,现在竟然也能玩出花来?比如,早期的电话手表,那时候的功能可真...
安卓老系统手机游戏,安卓老系统... 你有没有发现,那些安卓老系统手机,虽然看起来有点古老,但它们在游戏界可是有着自己独特的魅力呢!想象那...
安卓系统重启还是开关,重启与开... 手机突然卡壳了,是不是又该给安卓系统来个重启大法了?别急,今天就来聊聊这个让人又爱又恨的“安卓系统重...
安卓系统刷入iso,轻松实现个... 你有没有想过,你的安卓手机其实可以像变形金刚一样,换上全新的“皮肤”?没错,就是刷入ISO系统!这可...
安卓机系统无法关机,探究原因与... 最近我的安卓手机怎么啦?总是关机不成功,真是让人头疼啊!这可怎么办呢?别急,让我来帮你分析找出解决这...
安卓什么系统广告最多,揭秘最新... 你有没有发现,每次打开安卓手机,广告就像无处不在的小精灵,跳来跳去,让人眼花缭乱?今天,就让我带你一...
禁止中国使用安卓系统,“安卓系... 你知道吗?最近互联网上掀起了一股热议,那就是关于中国是否应该禁止使用安卓系统的话题。这可不是闹着玩的...
如何分辨ios系统和安卓系统,... 你有没有想过,你的手机里装的是iOS系统还是安卓系统呢?这两种系统各有千秋,但分辨它们其实并不难。今...
如何查询安卓系统版本,安卓系统... 你有没有想过,你的安卓手机里隐藏着一个小秘密——那就是它的系统版本!知道这个秘密,不仅能让你更好地了...
lg电视系统和安卓系统比较,性... 你有没有发现,现在家里的电视已经不再是那个傻乎乎的“大盒子”了?它变得聪明起来,能和你互动,能上网,...