MC_Launcher @ 2021-02-15 17:48:35
#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数组中下标
by xs_siqi @ 2021-02-15 18:31:05
@MC_Launcher 这很明显吧...
#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<now-k+1)t=now-k+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,-127,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<now-k+1)t=now-k+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]<<" ";
}
}
枚举到
by MC_Launcher @ 2021-02-15 19:51:13
@xs_siqi 我刚刚自己已经发现了,谢谢大佬%%%