POJ-2823 Sliding Window

1.题目链接

Sliding Window

2.题意

给你一个长度为n的数列,要求求出每个连续的长度为m的字串的最大值和最小值。

3.解法

单调队列的简单应用

4.代码

# include <cstdio>

int v[1111111];
int deq[1111111], head, tail;
int main(){
	// std::ios::sync_with_stdio(false);cin.tie(0);
	int n, w; 
	while (~scanf("%d%d", &n, &w)){
		for (int i = 0; i < n; i++)
			scanf("%d", &v[i]);

		int s, e;
		s = e = 0;
		head = tail = 0;
		while (s + w <= n){
			while (e-s<w) {
				while (tail > head && v[e] < v[deq[tail-1]]){
					--tail;
				}
				deq[tail++] = e++;
			}
			printf("%d%c", v[deq[head]], s==n-w?'\n':' ');
			s++; 
			if (deq[head] < s) head++; 
		}


		s = e = 0;
		head = tail = 0;
		while (s + w <= n){
			while (e-s<w) {
				while (tail > head && v[e] > v[deq[tail-1]]){
					--tail;
				}
				deq[tail++] = e++;
			}
			printf("%d%c", v[deq[head]], s==n-w?'\n':' ');
			s++; 
			if (deq[head] < s) head++; 
		}


	}
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值