Cod sursa(job #1728932)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 13 iulie 2016 21:21:39
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.98 kb
#include<cstdio>
#define MAXN 1010
#define INF 100000
using namespace std;
int n,m,answer,options;
int h[MAXN][MAXN],Min[MAXN][MAXN],Max[MAXN][MAXN];
struct Stack{
    int line;
    int column;
};
Stack MinStack[MAXN],MaxStack[MAXN];
void Compute(int dx,int dy){
    int i,j,minLeft,minRight,maxLeft,maxRight,value;
    for(j=1;j<=m;j++){
        minLeft=maxLeft=minRight=maxRight=1;
        MinStack[1].line=MaxStack[1].line=1;
        MinStack[1].column=MaxStack[1].column=j;
        Min[1][j]=Max[1][j]=h[1][j];
        for(i=2;i<=n;i++){
            while(MinStack[minLeft].line<=i-dx)
                minLeft++;
            while(minRight>=minLeft&&h[MinStack[minRight].line][MinStack[minRight].column]>=h[i][j])
                minRight--;
            minRight++;
            MinStack[minRight].line=i;
            MinStack[minRight].column=j;
            while(MaxStack[maxLeft].line<=i-dx)
                maxLeft++;
            while(maxRight>=maxLeft&&h[MaxStack[maxRight].line][MaxStack[maxRight].column]<=h[i][j])
                maxRight--;
            maxRight++;
            MaxStack[maxRight].line=i;
            MaxStack[maxRight].column=j;
            Min[i][j]=h[MinStack[minLeft].line][MinStack[minLeft].column];
            Max[i][j]=h[MaxStack[maxLeft].line][MaxStack[maxLeft].column];
        }
    }
    for(i=dx;i<=n;i++){
        minLeft=maxLeft=minRight=maxRight=1;
        MinStack[1].line=MaxStack[1].line=i;
        MinStack[1].column=MaxStack[1].column=1;
        for(j=2;j<=m;j++){
            while(MinStack[minLeft].column<=j-dy)
                minLeft++;
            while(minLeft<=minRight&&Min[MinStack[minRight].line][MinStack[minRight].column]>=Min[i][j])
                minRight--;
            minRight++;
            MinStack[minRight].line=i;
            MinStack[minRight].column=j;
            while(MaxStack[maxLeft].column<=j-dy)
                maxLeft++;
            while(maxLeft<=maxRight&&Max[MaxStack[maxRight].line][MaxStack[maxRight].column]<=Max[i][j])
                maxRight--;
            maxRight++;
            MaxStack[maxRight].line=i;
            MaxStack[maxRight].column=j;
            if(j>=dy){
                value=Max[MaxStack[maxLeft].line][MaxStack[maxLeft].column]-Min[MinStack[minLeft].line][MinStack[minLeft].column];
                if(value<answer){
                    answer=value;
                    options=1;
                }
                else
                    if(value==answer)
                        options++;
            }
        }
    }
}
int main(){
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    int i,j,dx,dy,p;
    scanf("%d%d%d",&n,&m,&p);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&h[i][j]);
    for(i=1;i<=p;i++){
        scanf("%d%d",&dx,&dy);
        answer=INF;
        Compute(dx,dy);
        if(dx!=dy)
            Compute(dy,dx);
        printf("%d %d\n",answer,options);
    }
    return 0;
}