单调队列模版80pts求调悬赏关注
查看原帖
单调队列模版80pts求调悬赏关注
882193
Blue_Flower楼主2023/9/11 22:15

#1很玄学,下载了测试数据之后本地跑了代码,与期望输出一致。。。 #3 RE 不知所措。。。。。。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,k,h1=1,r1=1,h2=1,r2=1;
struct node{
	int id;
	ll data;
}w1[10000100],w2[10000100];   //懒得写循环队列,防越界多开了10倍的数组(虽然用不了那么大) 
//w1:升序  w2:降序 
ll read()   //快读 
{
	char x=getchar();
	ll res=0,f=1;
	if(x=='-') f=-1;
	while(x<'0'||x>'9') x=getchar();
	while(x>='0'&&x<='9') 
	{
		res=res*10+x-'0';
		x=getchar();
	}
	return res*f;
}

vector<ll> ans1,ans2;    //不知为何就是想用vector存答案 

int main()
{
	n=read();k=read();
	int tmp;
	w1[0].data=100000000000;
	for(int i=1;i<=n;i++)
	{
	    tmp=read();
	    //升序队列 
	    while(i-k>=w1[h1].id) h1++;
	    while(tmp<w1[r1-1].data&&r1>h1) r1--;
	    w1[r1].data=tmp;w1[r1++].id=i;
	    //降序队列 
	    while(i-k>=w2[h2].id) h2++;
	    while(tmp>w2[r2-1].data&&r2>h2) r2--;
	    w2[r2].data=tmp;w2[r2++].id=i;
	    //存答案 
	    if(i>=k)
	    {
	    	ans1.push_back(w1[h1].data);
	    	ans2.push_back(w2[h2].data);
		}
	}
	int len=ans1.size();
	for(int i=0;i<len;i++) printf("%lld ",ans1[i]);
	puts("");
	for(int i=0;i<len;i++) printf("%lld ",ans2[i]);
}

#1 数据: 输入: 10 3 -94 21 24 73 38 77 11 73 9 -88 输出: -94 21 24 38 11 11 9 -88 24 73 73 77 77 77 73 73

2023/9/11 22:15
加载中...