单调队列 90分 第二个点TLE 求助大佬
查看原帖
单调队列 90分 第二个点TLE 求助大佬
170047
小渣青999楼主2020/8/26 09:04
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
struct node
{
	int wei,val;
	bool operator < (const node &a) const
	{
		return val<a.val;//大顶堆 
	}
};
struct node1
{
	int wei,val;
	bool operator <(const node1 &a) const
	{
		return val>a.val;
	}
};
priority_queue<node> q;
priority_queue<node1>q1;
int a[1000010];
int read()
{
	int x=0,f=1;
	char c;
	c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c<='9'&&c>='0')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
int main()
{
	int n=read(),m=read();
	//printf("n:%d m:%d\n",n,m);
//	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) a[i]=read();
	//scanf("%d",&a[i]); 
	for(int i=1;i<=n;i++)
	{
		q1.push((node1){i,a[i]});
	//	printf("i:%d a:%d\n",i,a[i]);
		if(i>=m)
		{
			while(q1.top().wei<=i-m) q1.pop();
			printf("%d ",q1.top().val); 
		}
	}

	printf("\n");
	for(int i=1;i<=n;i++)
	{
		q.push((node){i,a[i]});
		if(i>=m)
		{
			while(q.top().wei<=i-m) q.pop();
			printf("%d ",q.top().val);
		}
	}
	return 0;
}

2020/8/26 09:04
加载中...