Cod sursa(job #3239272)

Utilizator tedicTheodor Ciobanu tedic Data 4 august 2024 02:21:07
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <fstream>
#include <deque>

using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
deque<int>q1,q2;
int v[1005][1005];
int matmax1[1005][1005], matmin1[1005][1005],matmax2[1005][1005],matmin2[1005][1005];
int max1[1005][1005],min1[1005][1005],max2[1005][1005],min2[1005][1005];
int n,m,k;
void calc(int x, int y, int minn[][1005], int maxx[][1005], int MINN[][1005], int MAXX[][1005])
{
    for(int i=1; i<=n; i++)
    {
        while(!q1.empty())
            q1.pop_back();
        while(!q2.empty())
            q2.pop_back();
        for(int j=1; j<=m; j++)
        {
            while(!q1.empty() && v[i][j]<v[i][q1.back()])
                q1.pop_back();
            q1.push_back(j);
            while(!q1.empty() && j-q1.front()>=x)
                q1.pop_front();

            while(!q2.empty() && v[i][j]>v[i][q2.back()])
                q2.pop_back();
            q2.push_back(j);
            while(!q2.empty() && j-q2.front()>=x)
                q2.pop_front();

            if(j>=x)
            {
                maxx[i][j-x+1]=v[i][q2.front()];
                minn[i][j-x+1]=v[i][q1.front()];
            }
        }
    }
    for(int j=1; j<=m-x+1; j++)
    {
        while(!q1.empty())
            q1.pop_back();
        while(!q2.empty())
            q2.pop_back();
        for(int i=1; i<=n; i++)
        {
            while(!q1.empty() && minn[i][j]<minn[q1.back()][j])
                q1.pop_back();
            q1.push_back(i);
            while(!q1.empty() && i-q1.front()>=y)
                q1.pop_front();

            while(!q2.empty() && maxx[i][j]>maxx[q2.back()][j])
                q2.pop_back();
            q2.push_back(i);
            while(!q2.empty() && i-q2.front()>=y)
                q2.pop_front();
            if(i>=y)
            {
                MAXX[i-y+1][j]=maxx[q2.front()][j];
                MINN[i-y+1][j]=minn[q1.front()][j];
            }
        }
    }
}
int main()
{
    cin>>n>>m>>k;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            cin>>v[i][j];
    int dx,dy;
    while(k>0)
    {
        cin>>dx>>dy;
        calc(dx,dy,matmin1,matmax1,min1,max1);
        calc(dy,dx,matmin2,matmax2,min2,max2);
//        for(int i=1; i<=n; i++)
//        {
//            for(int j=1; j<=m-dx+1; j++)
//                cout<<matmin1[i][j]<<" ";
//            cout<<'\n';
//        }

//        for(int i=1; i<=n-dy+1; i++)
//        {
//            for(int j=1; j<=m-dx+1; j++)
//                cout<<min1[i][j]<<" ";
//            cout<<'\n';
//        }
        int mindif=2100000000,cnt=0;
        for(int i=1; i<=n-dy+1; i++)
            for(int j=1; j<=m-dx+1; j++)
            {
                if(max1[i][j]-min1[i][j]<mindif)
                    mindif=max1[i][j]-min1[i][j], cnt=1;
                else if(max1[i][j]-min1[i][j]==mindif)
                    cnt++;
            }
        for(int i=1; i<=n-dx+1; i++)
            for(int j=1; j<=m-dy+1; j++)
            {
                if(max2[i][j]-min2[i][j]<mindif)
                    mindif=max2[i][j]-min2[i][j], cnt=1;
                else if(max2[i][j]-min2[i][j]==mindif)
                    cnt++;
            }
            if(dx==dy)
                cnt/=2;
        cout<<mindif<<" "<<cnt<<'\n';
        k--;
    }
    return 0;
}