【模板】单调队列

C++版本:

单调递增单调队列

void min_monotonic_queue() {//单调递增(维护最小值) 
	int head = 1, till = 0;//队列头尾下标(指针) 
	int que[maxn], p[maxn];//que队列 p标记入队时间 
	for (int i = 1; i <= n; i++) {
		//弹出比当前值要差的元素(维护单调性)
		while (head <= till && que[till] >= a[i])till--;
		que[++till] = a[i];//新元素入队
		p[till] = i;//标记新元素入队时间 
		while (p[head] <= i - k)head++;//丢弃过期元素 
	}
}

单调递减单调队列

void max_monotonic_queue() {//单调递减(维护最大值) 
	int head = 1, till = 0;//队列头尾下标(指针)
	int que[maxn], p[maxn];//que队列 p标记入队时间 
	for (int i = 1; i <= n; i++) {
		//弹出比当前值要差的元素(维护单调性)
		while (head <= till && que[till] <= a[i])till--;
		que[++till] = a[i];//新元素入队 
		p[till] = i;//标记新元素入队时间 
		while (p[head] <= i - k)head++;//丢弃过期元素 
	}
}
posted @ 2020-09-17 16:51  pjhui  阅读(124)  评论(0编辑  收藏  举报