Cod sursa(job #2067617)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 16 noiembrie 2017 17:41:29
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <cstdio>
#include <deque>
#define INF 2000000000
using namespace std;
int a[1001][1001],maxi[1001][1001],mini[1001][1001];
deque <int> d,d2;
int apar,n,m,st;
void dmin (int l,int x){
    int i;
    for (i=1;i<x;i++){
        while (d.size()!=0 && a[l][i]<a[l][d.back()])
            d.pop_back();
        d.push_back(i);
    }
    for (i=x;i<=m;i++){
        if (i-d.front()+1>x)
            d.pop_front();
        while (d.size()!=0 && a[l][i]<a[l][d.back()])
            d.pop_back();
        d.push_back(i);
        mini[l][i]=a[l][d.front()];
    }
}
void dmax (int l,int x){
    int i;
    for (i=1;i<x;i++){
        while (d.size()!=0 && a[l][i]>a[l][d.back()])
            d.pop_back();
        d.push_back(i);
    }
    for (i=x;i<=m;i++){
        if (i-d.front()+1>x)
            d.pop_front();
        while (d.size()!=0 && a[l][i]>a[l][d.back()])
            d.pop_back();
        d.push_back(i);
        maxi[l][i]=a[l][d.front()];
    }
}
int calc (int c,int x){
    int i,minn=INF; /// in d e maxim si in d2 e minim
    for (i=1;i<x;i++){
        while (d.size()!=0 && maxi[i][c]>maxi[d.back()][c])
            d.pop_back();
        d.push_back(i);
        while (d2.size()!=0 && mini[i][c]<mini[d2.back()][c])
            d2.pop_back();
        d2.push_back(i);
    }
    for (i=x;i<=n;i++){
        if (i-d.front()+1>x)
            d.pop_front();
        while (d.size()!=0 && maxi[i][c]>maxi[d.back()][c])
            d.pop_back();
        d.push_back(i); /// modific deque ul cu maxime
        if (i-d2.front()+1>x)
            d2.pop_front();
        while (d2.size()!=0 && mini[i][c]<mini[d2.back()][c])
            d2.pop_back();
        d2.push_back(i); /// modific deque ul cu minime
        if (maxi[d.front()][c]-mini[d2.front()][c]==minn)
            st++;
        else if (maxi[d.front()][c]-mini[d2.front()][c]<minn){
            minn=maxi[d.front()][c]-mini[d2.front()][c];
            st=1;
        }
        //printf ("%d %d\n",d.front(),d2.front());
    }
    //printf ("\n\n");
    return minn;
}
int solve (int x,int y){
    int i,j,sol=INF,nr;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++){
            maxi[i][j]=0;
            mini[i][j]=INF;
        }
    for (i=1;i<=n;i++){
        d.clear ();
        dmin(i,y);
        d.clear();
        dmax(i,y);
    }
    for (i=y;i<=m;i++){
        st=0;
        d.clear();
        d2.clear();
        nr=calc(i,x);
        if (nr==sol)
            apar+=st;
        else if (nr<sol){
            sol=nr;
            apar=st;
        }
    }
    return sol;
}
int main()
{
    FILE *fin=fopen ("struti.in","r");
    FILE *fout=fopen ("struti.out","w");
    int k,i,j,x,y,s1,s2,ok1,ok2;
    fscanf (fin,"%d%d%d",&n,&m,&k);
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            fscanf (fin,"%d",&a[i][j]);
    for (;k;k--){
        fscanf (fin,"%d%d",&x,&y);
        apar=0;
        s1=solve(x,y);
        ok1=apar;
        apar=0;
        s2=solve(y,x);
        ok2=apar;
        if (x==y)
            fprintf (fout,"%d %d\n",s1,ok1);
        else{
            if (s2<s1)
                fprintf (fout,"%d %d\n",s2,ok2);
            else if (s1<s2)
                fprintf (fout,"%d %d\n",s1,ok1);
            else fprintf (fout,"%d %d\n",s1,ok1+ok2);
        }
    }
    return 0;
}