7.28集训

上午

教练让补补坑

先改了改以前的题,然后开始透彻几道题

1.滑稽窗口

以前总是感觉迷迷糊糊不太透彻,今天tmd终于搞明白了

我们维护一个希望维护一个长度为m的队列,对于求最小值的时候,我们维护单增队列,所以队尾一定要保证是最大的

所以对于当前的\(a[i]\),我们必须保证\(a[i] > a[q[t]]\)才能使其入队,否则就一直让队尾缩短

对于求最大值的时候,我们希望维护一个递减队列,保证队尾最小

所以同理,对于当前的\(a[i]\),我们保证\(a[i] > a[q[t]]\)才能使其入队,否则一直\(--t\)

(最近超喜欢写han yu pin yin 的函数)

return ~~(0^_^0);

其中

define _ 0

下面给出漂亮的代码

#include <bits/stdc++.h>
#define _ 0
using namespace std;

const int N = 1e6+66;

int n, m;
int a[N], q[N];

inline void shuruyijichushihua () {
	cin >> n >> m;
	for (int i = 1; i <= n; ++ i) cin >> a[i];
}

inline void caozuoyifan () {
	int h = 1, t = 0;
	for (int i = 1; i <= n; ++ i) {
		while (h <= t && q[h] + m <= i) ++ h;
		while (h <= t && a[i] < a[q[t]]) -- t;
		q[++ t] = i;
		if (i >= m) cout << a[q[h]] << ' ';
	}
	cout << '\n';
	memset(q, 0, sizeof q);
	for (int i = 1; i <= n; ++ i) {
		while (h <= t && q[h] + m <= i) ++ h;
		while (h <= t && a[i] > a[q[t]]) -- t;
		q[++ t] = i;
		if (i >= m) cout << a[q[h]] << ' ';
	}
}

int main () {
	shuruyijichushihua();
	caozuoyifan();
	return ~~(0^_^0);
}

猜你喜欢

转载自www.cnblogs.com/yszhyhm/p/13389993.html