第一组数据RE(以及后面的许多组)求助,最小值输出一个错误的0但最大值正确
查看原帖
第一组数据RE(以及后面的许多组)求助,最小值输出一个错误的0但最大值正确
218387
MC_Launcher楼主2021/2/15 17:48
#include<bits/stdc++.h>
using namespace std;
int a[1000010],dl[10000100][2];
int h,t,now;
int maxn,minn;
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	h=1,t=1;
	dl[1][0]=a[1];
	dl[1][1]=1;
	for(int i=2;i<=k;i++)
	{	
		if(a[i]<dl[t][0])
		{
			while(a[i]<dl[t][0])
			{
				dl[t][0]=a[i];
				dl[t][1]=i;
				t--;
				if(t<1)break;
			}
			if(t<1)t=1;
			else t++;
		}
		else
		{
			t++;
			dl[t][0]=a[i];
			dl[t][1]=i;
		}
	}
	cout<<dl[h][0]<<" ";
	for(now=k+1;now<=n;now++)
	{
		if(a[now]<dl[t][0])
		{
			while(a[now]<dl[t][0])
			{
				dl[t][0]=a[now];
				dl[t][1]=now;
				t--;
				if(t<1)break;
			}
			if(t<1)t=1;
			else t++;
		}
		else
		{
			t++;
			dl[t][0]=a[now];
			dl[t][1]=now;
		}
		while(dl[h][1]<now-k+1)h++;
		cout<<dl[h][0]<<" ";
	}
	cout<<endl;
	memset(dl,0,sizeof(dl));
	//...
	h=1,t=1;
	dl[1][0]=a[1];
	dl[1][1]=1;
	for(int i=2;i<=k;i++)
	{
		if(a[i]>dl[t][0])
		{
			while(a[i]>dl[t][0])
			{
				dl[t][0]=a[i];
				dl[t][1]=i;
				t--;
				if(t<1)break;
			}
			if(t<1)t=1;
			else t++;
		}
		else
		{
			t++;
			dl[t][0]=a[i];
			dl[t][1]=i;
		}
	}
	cout<<dl[h][0]<<" ";
	for(now=k+1;now<=n;now++)
	{
		if(a[now]>dl[t][0])
		{
			while(a[now]>dl[t][0])
			{
				dl[t][0]=a[now];
				dl[t][1]=now;
				t--;
				if(t<1)break;
			}
			if(t<1)t=1;
			else t++;
		}
		else
		{
			t++;
			dl[t][0]=a[now];
			dl[t][1]=now;
		}
		while(dl[h][1]<now-k+1)h++;
		cout<<dl[h][0]<<" ";
	}
}

dl数组保存单调队列的数字及其在a数组中下标

2021/2/15 17:48
加载中...