单调队列求助
查看原帖
单调队列求助
740948
rb_tree楼主2025/1/29 19:19

rt

#include<cstdio>
#include<algorithm>
#include<queue>
#define int long long
using namespace std;
inline int read()
{
    int x=0,w=1;
    char ch=0;
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*w;
}
inline void write(int x) 
{
    if(x<0) 
    { 
        x=-x;
        putchar('-');
    }
    if(x>=10) write(x/10);
    putchar((x%10)^48);
}
int n,m,k,t1[1005][1005],t2[1005][1005];
deque<pair<int,int>> q1,q2;
void insert1(pair<int,int> p)
{
    while(!q1.empty()&&p.second-q1.front().second>=k) q1.pop_front();
    while(!q1.empty()&&q1.front().first<=p.first) q1.pop_front();
    q1.push_back(p);
}
void insert2(pair<int,int> p)
{
    while(!q2.empty()&&p.second-q2.front().second>=k) q2.pop_front();
    while(!q2.empty()&&q2.front().first>=p.first) q2.pop_front();
    q2.push_back(p);
}
signed main()
{
    int ans=0x7fffffff;
    n=read();
    m=read();
    k=read();
    for(int i=1;i<=n;i++)
    {
        q1.clear();
        q2.clear();
        for(int j=1;j<=m;j++)
        {
            int x=read();
            insert1({x,j});
            insert2({x,j});
            if(j>=k)
            {
                t1[i][j]=q1.front().first;
                t2[i][j]=q2.front().first;
            }
        }
    }
    for(int j=k;j<=m;j++)
    {
        q1.clear();
        q2.clear();
        for(int i=1;i<=n;i++)
        {
            insert1({t1[i][j],i});
            insert2({t2[i][j],i});
            if(i>=k) ans=min(ans,q1.front().first-q2.front().first);
        }
    }
    write(ans);
    return 0;
}
2025/1/29 19:19
加载中...