单调队列10pt求助
查看原帖
单调队列10pt求助
247359
WuhenGSL楼主2021/7/19 10:09

RT,跑两遍单调队列求出最小值和最大值矩阵,再遍历求答案。然后wa了,错误信息都是read 0 expect 9

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#define N 2010
#define int long long
#define re register
using namespace std;
int n,m,k,head,tail;
int minn[N][N],maxx[N][N],Lmin[N][N],Lmax[N][N],q[N],a[N],p[N];
inline void read(int &x)
{
	char c;x=0;int f=1;
	while(!isdigit(c))
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(isdigit(c))x=x*10+c-'0',c=getchar();
	x*=f;
}
void get_min(int x){
    head=1,tail=0;int cnt=0;
    for(int i=1;i<=k;++i){
        while(head<=tail&&q[tail]>=a[i])tail--;
        q[++tail]=a[i];
        p[tail]=i;
    }
    Lmin[x][++cnt]=q[head];
    for(int i=k+1;i<=m;++i){
        while(head<=tail&&q[tail]>=a[i])tail--;
        q[++tail]=a[i];
        p[tail]=i;
        while(p[head]<i-k+1)head++;
        Lmin[x][++cnt]=q[head];
    }
}

void get_max(int x){
    head=1,tail=0;int cnt=0;
    for(int i=1;i<=k;++i){
        while(head<=tail&&q[tail]<=a[i])tail--;
        q[++tail]=a[i];
        p[tail]=i;
    }
    Lmax[x][++cnt]=q[head];
    for(int i=k+1;i<=m;++i){
        while(head<=tail&&q[tail]<=a[i])tail--;
        q[++tail]=a[i];
        p[tail]=i;
        while(p[head]<i-k+1)head++;
        Lmax[x][++cnt]=q[head];
    }
}
void get_minans(int x){
    head=1,tail=0;int cnt=0;
    for(int i=1;i<=k;++i){
        while(head<=tail&&q[tail]>=Lmin[i][x])tail--;
        q[++tail]=Lmin[i][x];
        p[tail]=i;
    }
    minn[++cnt][x]=q[head];
    for(int i=k+1;i<=n;++i){
        while(head<=tail&&q[tail]>=Lmin[i][x])tail--;
        q[++tail]=Lmin[i][x];
        p[tail]=i;
        while(p[head]<i-k+1)head++;
        minn[++cnt][x]=q[head];
    }
}

void get_maxans(int x){
    head=1,tail=0;int cnt=0;
    for(int i=1;i<=k;++i){
        while(head<=tail&&q[tail]<=Lmax[i][x])tail--;
        q[++tail]=Lmax[i][x];
        p[tail]=i;
    }
    maxx[++cnt][x]=q[head];
    for(int i=k+1;i<=n;++i){
        while(head<=tail&&q[tail]<=Lmax[i][x])tail--;
        q[++tail]=Lmax[i][x];
        p[tail]=i;
        while(p[head]<i-k+1)head++;
        maxx[++cnt][x]=q[head];
    }
}
signed main()
{
	read(n),read(m),read(k);
	for(int i=1;i<=n;++i)
	{
		for(re int j=1;j<=m;++j)
		{
			read(a[j]);		
		}
		get_min(i);get_max(i);
	}
	for(int j=1;j<m;++j)
	{
		get_minans(j);get_maxans(j);
	}
	int ans=2147483647;
	for(int i=1;i<n;++i)
	{
		for(int j=1;j<m;++j)
		{
			ans=min(ans,maxx[i][j]-minn[i][j]);

		}
	}
	printf("%lld",ans);
	return 0;
}








2021/7/19 10:09
加载中...