Cod sursa(job #2119231)

Utilizator LucaSeriSeritan Luca LucaSeri Data 31 ianuarie 2018 20:32:25
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1001;

int mat[MAXN][MAXN];
int maxim[MAXN][MAXN];
int minim[MAXN][MAXN];


void solve(int n, int m, int dx, int dy, int &ans, int &cnt){

    for(int j = 0; j < m; ++j){
        deque< int > maxx;
        deque< int > minn;
        for(int i = 0; i < n; ++i){
            while(maxx.size() && mat[maxx.back()][j] <= mat[i][j]) maxx.pop_back();
            while(minn.size() && mat[minn.back()][j] >= mat[i][j]) minn.pop_back();

            maxx.push_back(i);
            minn.push_back(i);

            if(i - maxx.front() == dx) maxx.pop_front();
            if(i - minn.front() == dx) minn.pop_front();

            maxim[i][j] = mat[maxx.front()][j];
            minim[i][j] = mat[minn.front()][j];
        }
    }

    for(int i = dx - 1; i < n; ++i){
        deque< int > maxx;
        deque< int > minn;

        for(int j = 0 ; j < dy - 1; ++j){
            while(maxx.size() && maxim[i][maxx.back()] <= maxim[i][j]) maxx.pop_back();
            while(minn.size()&& minim[i][minn.back()] >= minim[i][j]) minn.pop_back();

            maxx.push_back(j);
            minn.push_back(j);

            if(j - maxx.front() == dy) maxx.pop_front();
            if(j - minn.front() == dy) minn.pop_front();

        }

        for(int j = dy - 1; j < m; ++j){
            while(maxx.size() && maxim[i][maxx.back()] < maxim[i][j]) maxx.pop_back();
            while(minn.size() && minim[i][minn.back()] > minim[i][j]) minn.pop_back();

            maxx.push_back(j);
            minn.push_back(j);

            if(j - maxx.front() == dy) maxx.pop_front();
            if(j - minn.front() == dy) minn.pop_front();

            int curr = maxim[i][maxx.front()] - minim[i][minn.front()];
            if(curr < ans) ans = curr, cnt = 0;
            if(curr == ans) ++cnt;
        }
    }
}
int main(){

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

    int n, m, p;
    f >> n >> m >> p;

    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j){
            f >> mat[i][j];
        }
    }
    while(p--){
        int dx, dy;
        f >> dx >> dy;

        int ans = 1e9;
        int cnt = 0;

        solve(n, m, dx, dy, ans, cnt);

        if(dx != dy) solve(n, m, dy, dx, ans, cnt);

        g << ans << ' ' << cnt << '\n';
    }
    return 0;
}