Cod sursa(job #2592811)

Utilizator ptudortudor P ptudor Data 2 aprilie 2020 13:41:58
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <bits/stdc++.h>
#define inf 1000000005
using namespace std;

ifstream in("struti.in");
ofstream out("struti.out");

deque<int> dmax,dmin;
int n,m,a[1005][1005],p,maxim[1005][1005],sol=inf,cr,minim[1005][1005],smax[1005],smin[1005];
vector<int> get(vector<int> v, int n, int k)
{
    int i;
    dmax.clear();
    dmin.clear();
    for (i = 1; i <= n; i++) {
        ///maxim
        while (!dmax.empty() && v[i] >= v[dmax.back()])
            dmax.pop_back();
        dmax.push_back(i);
        while (dmax.front() < i - k + 1)
            dmax.pop_front();
        smax[i] = v[dmax.front()];

        ///minim
        while (!dmin.empty() && v[i] <= v[dmin.back()])
            dmin.pop_back();
        dmin.push_back(i);
        while (dmin.front() < i - k + 1)
            dmin.pop_front();
        smin[i] = v[dmin.front()];
    }

}
int solve(int y, int x)
{int i,j,cost,sol_max[1005],sol_min[1005];
    vector<int> v,s[2];
    //cout << "k = " << y << "\n";
    for (j = 1; j <= m; j++) {
        v.clear();
        v.resize(n + 1);
        for (i = 1; i <= n; i++)
            v[i] = a[i][j];
        get(v , n , y);

        for (i = 1; i <= n; i++) {
            maxim[i][j] = smax[i];
            minim[i][j] = smin[i];
        }
    }

    for (i = y; i <= n; i++) {
        v.clear();
        v.resize(m + 1);
        for (j = 1; j <= m; j++)
            v[j] = maxim[i][j];
        get(v , m , x);

       for (j = 1; j <= m; j++)
            sol_max[j] = smax[j];

        for (j = 1; j <= m; j++)
            v[j] = minim[i][j];
        get(v , m , x);

        for (j = 1; j <= m; j++)
            sol_min[j] = smin[j];

        for (j = x; j <= m; j++)
        {
            cost = sol_max[j] - sol_min[j];
            if (cost < sol) sol = cost, cr = 1;
            else if(cost == sol) cr++;
        }
    }
}
int main()
{int i,j,dx,dy,p1,p2;
    in >> n >> m >> p;
    for (i = 1; i <= n; i++) for (j = 1; j <= m; j++) in >> a[i][j];
    for (i = 1; i <= p; i++)
    {
        in >> dx >> dy;
        sol = inf;
        solve(dy , dx);
        if (dx != dy)
        solve(dx , dy);

        out << sol << " " << cr << "\n";
    }
}