Cod sursa(job #2231770)

Utilizator armigheGheorghe Liviu Armand armighe Data 15 august 2018 22:03:35
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include<cstdio>
#include<fstream>
#include<deque>
using namespace std;
FILE *f=fopen("struti.in","r");
ofstream g("struti.out");
int n,m,a[1002][1002],b[1002][1002],minim[1002][1002],maxim[1002][1002];
deque<int>dq;
void cmin(int x,int y)
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            while(!dq.empty()&&a[i][j]<=a[i][dq.back()])
                dq.pop_back();
            dq.push_back(j);
            if(dq.back()-dq.front()>=y)
                dq.pop_front();
            if(j>=y)
                b[i][j-y+1]=a[i][dq.front()];
        }
        dq.clear();
    }
    dq.clear();
    for(j=1;j<=m-y+1;j++)
    {
        for(i=1;i<=n;i++)
        {
            while(!dq.empty()&&b[i][j]<=b[dq.back()][j])
                dq.pop_back();
            dq.push_back(i);
            if(dq.back()-dq.front()>=x)
                dq.pop_front();
            if(i>=x)
                minim[i-x+1][j]=b[dq.front()][j];
        }
        dq.clear();
    }
    dq.clear();
}

void cmax(int x,int y)
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            while(!dq.empty()&&a[i][j]>=a[i][dq.back()])
                dq.pop_back();
            dq.push_back(j);
            if(dq.back()-dq.front()>=y)
                dq.pop_front();
            if(j>=y)
                b[i][j-y+1]=a[i][dq.front()];
        }
        dq.clear();
    }
    dq.clear();
    for(j=1;j<=m-y+1;j++)
    {
        for(i=1;i<=n;i++)
        {
            while(!dq.empty()&&b[i][j]>=b[dq.back()][j])
                dq.pop_back();
            dq.push_back(i);
            if(dq.back()-dq.front()>=x)
                dq.pop_front();
            if(i>=x)
                maxim[i-x+1][j]=b[dq.front()][j];
        }
        dq.clear();
    }
    dq.clear();
}

int main()
{
    int p,i,j,x,y,sol,k,l;
    fscanf(f,"%d%d%d",&n,&m,&p);
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        fscanf(f,"%d",&a[i][j]);
    for(l=1;l<=p;l++)
    {
        fscanf(f,"%d%d",&x,&y);
        cmin(x,y);
        cmax(x,y);
        sol=1000000;
        k=0;
        for(i=1;i<=n-x+1;i++)
        for(j=1;j<=m-y+1;j++)
        {
            if(maxim[i][j]-minim[i][j]<sol)
                sol=maxim[i][j]-minim[i][j],k=1;
            else
            if(maxim[i][j]-minim[i][j]==sol)
                k++;
        }
        if(x!=y)
        {
            cmin(y,x);
            cmax(y,x);
            for(i=1;i<=n-y+1;i++)
            for(j=1;j<=m-x+1;j++)
            {
                if(maxim[i][j]-minim[i][j]<sol)
                    sol=maxim[i][j]-minim[i][j],k=1;
                else
                if(maxim[i][j]-minim[i][j]==sol)
                    k++;
            }
        }
        g<<sol<<" "<<k<<'\n';
    }
    return 0;
}