单调队列做法30pts,求大佬看哪里错了
查看原帖
单调队列做法30pts,求大佬看哪里错了
472963
PMZG楼主2021/3/21 11:42
#include <bits/stdc++.h>
using namespace std;
struct p{
	int id;
	int num;
}m[1005][1005];
p ma[1005][1005],mi[1005][1005];
int mma[1005][1005],mmi[1005][1005];
int ma1,mi1,ma2,mi2;int s=2147483647;
void addmi(int x,int i)
{
	mi[i][++mi1].num=x;
	mi[i][mi1].id=i;
}
void addma(int x,int i)
{
	ma[i][++ma1].num=x;
	ma[i][ma1].id=i;
}
void addmmi(int x,int j)
{
	mmi[++mi2][j]=x;
}
void addmma(int x,int j)
{
	mma[++ma2][j]=x;
}
deque <p> q;
int main()
{
	int a,b,n;
	scanf("%d%d%d",&a,&b,&n);
	for(int i=1;i<=a;i++)
	  for(int j=1;j<=b;j++)
	  {
	  	scanf("%d",&m[i][j].num);
	  	m[i][j].id=j;
	  }
	for(int i=1;i<=a;i++)
	{
	  q.clear();mi1=0;
	  for(int j=1;j<=b;j++)
	  {
	  	while(!q.empty()&&q.front().id<=j-n)q.pop_front();
	  	while(!q.empty()&&q.back().num>=m[i][j].num)q.pop_back();
	  	q.push_back(m[i][j]);
	  	if(j>=n)addmi(q.front().num,i);
	  }
	}
	for(int i=1;i<=a;i++)
	{
	  q.clear();ma1=0;
	  for(int j=1;j<=b;j++)
	  {
	  	while(!q.empty()&&q.front().id<=j-n)q.pop_front();
	  	while(!q.empty()&&q.back().num<=m[i][j].num)q.pop_back();
	  	q.push_back(m[i][j]);
	  	if(j>=n)addma(q.front().num,i);
	  }
	}  
    for(int i=1;i<=mi1;i++)
    {
    	q.clear();mi2=0;
    	for(int j=1;j<=a;j++)
    	{
    		while(!q.empty()&&q.front().id<=j-n)q.pop_front();
    		while(!q.empty()&&q.front().num>=mi[j][i].num)q.pop_back();
    	    q.push_back(mi[j][i]);
            if(j>=n)addmmi(q.front().num,i);
    	}
    }
    for(int i=1;i<=ma1;i++)
    {
    	q.clear();ma2=0;
    	for(int j=1;j<=a;j++)
    	{
    		while(!q.empty()&&q.front().id<=j-n)q.pop_front();
    		while(!q.empty()&&q.front().num<=ma[j][i].num)q.pop_back();
    	    q.push_back(ma[j][i]);
            if(j>=n)addmma(q.front().num,i);
    	}
    }
    for(int i=1;i<=ma2;i++)
      for(int j=1;j<=ma1;j++)
        s=min(s,mma[i][j]-mmi[i][j]);
    printf("%d",s);
	return 0; 
}
2021/3/21 11:42
加载中...