单调队列为什么要开一个记录编号的数组
查看原帖
单调队列为什么要开一个记录编号的数组
434015
Calanosay楼主2021/3/28 12:04
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int q[maxn],k,n,a[maxn],p[maxn];
void solve(){
	int head=1,tail=0;
	memset(q,0,sizeof(q));
	for(int i=1;i<=n;i++){
		while(head<=tail&&a[i]>=q[tail])	tail--;
		q[++tail]=a[i];
		p[tail]=i;
		while(p[head]<=i-k)	head++;
		if(i>=k)	printf("%d ",q[head]);
	}
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
	solve();
} 

上面的是正确代码,求最大值的

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int q[maxn],k,n,a[maxn],p[maxn];
void solve(){
	int head=1,tail=0;
	memset(q,0,sizeof(q));
	for(int i=1;i<=n;i++){
		while(head<=tail&&a[i]>=q[tail])	tail--;
		q[++tail]=a[i];
		while(head<=i-k)	head++;
		if(i>=k)	printf("%d ",q[head]);
	}
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
	solve();
} 

这是我的代码,没有用p数组存储tail的下标,因为我感觉tail本身就是一个编号一样的东西,比如tail=7就证明tail现在在7号位置,请问我的想法错在哪里

2021/3/28 12:04
加载中...