Cod sursa(job #913886)

Utilizator assa98Andrei Stanciu assa98 Data 13 martie 2013 20:29:49
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <cstdio>
#include <cstring>
#include <deque>
#include <fstream>
using namespace std;

deque<int> d1;
deque<int> d2;

struct sp
{
    int a;
    int b;
    sp()
    {
        a=0;
        b=0;
    }
    sp(int x,int y)
    {
        a=x;
        b=y;
    }
};

int x[1010][1010];

int xmin[1010][1010];
int xmax[1010][1010];

int n,m,p;

void compute(int k)
{
    memset(xmin,0,sizeof(xmin));
    memset(xmax,0,sizeof(xmax));
    for(int j=1; j<=m; j++)
    {
        d1.clear();
        d2.clear();
        for(int i=1; i<=n; i++)
        {
            while(!d1.empty()&&i-d1.front()>=k)
                d1.pop_front();
            while(!d1.empty()&&x[i][j]<x[d1.back()][j])
                d1.pop_back();
            d1.push_back(i);
            xmin[i][j]=x[d1.front()][j];


            while(!d2.empty()&&i-d2.front()>=k)
                d2.pop_front();
            while(!d2.empty()&&x[i][j]>x[d2.back()][j])
                d2.pop_back();
            d2.push_back(i);
            xmax[i][j]=x[d2.front()][j];
        }
    }

}



sp solve(int l,int c)
{
    compute(l);
    int sol=32000;
    int count=0;
    for(int i=l; i<=n; i++)
    {
        d1.clear();
        d2.clear();
        for(int j=1; j<=m; j++)
        {
            while(!d1.empty()&&j-d1.front()>=c)
                d1.pop_front();
            while(!d1.empty()&&xmin[i][j]<xmin[i][d1.back()])
                d1.pop_back();
            d1.push_back(j);

            while(!d2.empty()&&j-d2.front()>=c)
                d2.pop_front();
            while(!d2.empty()&&xmax[i][j]>xmax[i][d2.back()])
                d2.pop_back();
            d2.push_back(j);

            if(j>=c)
            {
                int a=xmax[i][d2.front()]-xmin[i][d1.front()];
                if(a==sol)
                    count++;
                else if(a<sol)
                {
                    sol=a;
                    count=1;
                }
            }

        }
    }
    return sp(sol,count);
}
int main()
{
    ifstream cin("struti.in");
    freopen("struti.out","w",stdout);
    cin>>n>>m>>p;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            cin>>x[i][j];
        }
    for(int i=1; i<=p; i++)
    {
        int a,b;
        cin>>a>>b;
        sp rez=solve(a,b);
        sp rez2=solve(b,a);
        if(a!=b)
        {
            if(rez2.a<rez.a)
                rez=rez2;
            else if(rez2.a==rez.a)
                rez.b+=rez2.b;
        }
        printf("%d %d\n",rez.a,rez.b);
    }
    return 0;
}