Cod sursa(job #2059450)

Utilizator andra1782Andra Alazaroaie andra1782 Data 7 noiembrie 2017 00:59:27
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.35 kb
#include <stdio.h>
#include <deque>
#define MAX 1000
FILE *fin,*fout;
int n,m,t[MAX][MAX],min[MAX][MAX],max[MAX][MAX],min1[MAX][MAX],max1[MAX][MAX];

void sol(int dx, int dy){
    int i,j,a,b;

    std::deque<int>dqmin;
    std::deque<int>dqmax;
    for(i=0; i<m; i++){
        for(j=0; j<dy; j++){
            while(!dqmin.empty() && dqmin.back()>t[i][j])
                dqmin.pop_back();
            if(dqmin.empty() || dqmin.back()<=t[i][j])
                dqmin.push_back(t[i][j]);
            while(!dqmax.empty() && dqmax.back()<t[i][j])
                dqmax.pop_back();
            if(dqmax.empty() || dqmax.back()>=t[i][j])
                dqmax.push_back(t[i][j]);
        }
        min[i][0]=dqmin.front();
        max[i][0]=dqmax.front();
        for(j=dy; j<n; j++){
            if(dqmin.front()==t[i][j-dy])
                dqmin.pop_front();
            if(dqmax.front()==t[i][j-dy])
                dqmax.pop_front();
            while(!dqmin.empty() && dqmin.back()>t[i][j])
                dqmin.pop_back();
            if(dqmin.empty() || dqmin.back()<=t[i][j])
                dqmin.push_back(t[i][j]);
            while(!dqmax.empty() && dqmax.back()<t[i][j])
                dqmax.pop_back();
            if(dqmax.empty() || dqmax.back()>=t[i][j])
                dqmax.push_back(t[i][j]);
            min[i][j-dy+1]=dqmin.front();
            max[i][j-dy+1]=dqmax.front();
        }
        dqmin.clear();
        dqmax.clear();
    }
    //for(a=0; a<m; a++){for(b=0; b<=n-dy; b++)fprintf(fout,"%d ",min[a][b]);
    //fprintf(fout,"\n");}fprintf(fout,"\n");
    //for(a=0; a<m; a++){for(b=0; b<=n-dy; b++)fprintf(fout,"%d ",max[a][b]);
    //fprintf(fout,"\n");}fprintf(fout,"\n");fprintf(fout,"\n");
    for(j=0; j<=n-dy; j++){
        for(i=0; i<dx; i++){
            while(!dqmin.empty() && dqmin.back()>min[i][j])
                dqmin.pop_back();
            if(dqmin.empty() || dqmin.back()<=min[i][j])
                dqmin.push_back(min[i][j]);
            while(!dqmax.empty() && dqmax.back()<max[i][j])
                dqmax.pop_back();
            if(dqmax.empty() || dqmax.back()>=max[i][j])
                dqmax.push_back(max[i][j]);
        }
        min1[0][j]=dqmin.front();
        max1[0][j]=dqmax.front();
        for(i=dx; i<m; i++){
            if(dqmin.front()==min[i-dx][j])
                dqmin.pop_front();
            if(dqmax.front()==max[i-dx][j])
                dqmax.pop_front();
            while(!dqmin.empty() && dqmin.back()>min[i][j])
                dqmin.pop_back();
            if(dqmin.empty() || dqmin.back()<=min[i][j])
                dqmin.push_back(min[i][j]);
            while(!dqmax.empty() && dqmax.back()<max[i][j])
                dqmax.pop_back();
            if(dqmax.empty() || dqmax.back()>=max[i][j])
                dqmax.push_back(max[i][j]);
            min1[i-dx+1][j]=dqmin.front();
            max1[i-dx+1][j]=dqmax.front();
        }
        dqmin.clear();
        dqmax.clear();
    }
    //for(a=0; a<=m-dx; a++){for(b=0; b<=n-dy; b++)fprintf(fout,"%d ",min1[a][b]);
    //fprintf(fout,"\n");}fprintf(fout,"\n");
    //for(a=0; a<=m-dx; a++){for(b=0; b<=n-dy; b++)fprintf(fout,"%d ",max1[a][b]);
    //fprintf(fout,"\n");}fprintf(fout,"\n");fprintf(fout,"\n");
}

int main(){
    fin=fopen("struti.in","r");
    fout=fopen("struti.out","w");
    int p,i,j,k,minim,ap,dx,dy;

    fscanf(fin,"%d%d%d",&m,&n,&p);
    for(i=0; i<m; i++)
        for(j=0; j<n; j++)
            fscanf(fin,"%d",&t[i][j]);
    for(k=0; k<p; k++){
        minim=1000000000;
        ap=0;
        fscanf(fin,"%d%d",&dx,&dy);
        sol(dx,dy);
        for(i=0; i<=m-dx; i++)
            for(j=0; j<=n-dy; j++)
                if(max1[i][j]-min1[i][j]<minim){
                    minim=max1[i][j]-min1[i][j];
                    ap=1;
                }else if(max1[i][j]-min1[i][j]==minim)
                    ap++;
        if(dx!=dy){
            sol(dy,dx);
            for(i=0; i<=m-dy; i++)
                for(j=0; j<=n-dx; j++)
                    if(max1[i][j]-min1[i][j]<minim){
                        minim=max1[i][j]-min1[i][j];
                        ap=1;
                    }else if(max1[i][j]-min1[i][j]==minim)
                        ap++;
        }
        fprintf(fout,"%d %d\n",minim,ap);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}