60pts求调
查看原帖
60pts求调
1420422
Lyzc0dr楼主2025/1/24 15:37

MLE

#include <bits/stdc++.h>  
#define ll long long  
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);  
using namespace std;  

int x, y, n;  
ll a[1010][1010];  
ll lb[1010];  
ll dp1[1010][1010][8];  
ll dp2[1010][1010][8];  

void ini() {  
    lb[0] = -1;  
    for(int i = 1; i <= n; i++) {  
        lb[i] = (i & (i - 1)) ? lb[i - 1] : lb[i - 1] + 1;  
    }  
}  

void ST() {  
    for(int i = 1; i <= x; i++) {  
        for(int j = 1; j <= y; j++) {  
            dp1[i][j][0] = dp2[i][j][0] = a[i][j];  
        }  
    }  
    for(int k = 1; k <= x; k++) {  
        for(int j = 1; j <= lb[n]; j++) {  
            for(int i = 1; i <= y - (1 << j) + 1; i++) {  
                dp1[k][i][j] = max(dp1[k][i][j - 1], dp1[k][i + (1 << (j - 1))][j - 1]);  
                dp2[k][i][j] = min(dp2[k][i][j - 1], dp2[k][i + (1 << (j - 1))][j - 1]);  
            }  
        }  
    }  
}  

ll RMQ(int x, int y, int B) {  
    int len = lb[B];  
    ll maxs = -1;  
    ll mins = LLONG_MAX;  
    int l = y, r = y + B - 1;  
    for(int i = x; i < x + B; i++) {  
        maxs = max(maxs, max(dp1[i][l][len], dp1[i][r - (1 << len) + 1][len]));  
        mins = min(mins, min(dp2[i][l][len], dp2[i][r - (1 << len) + 1][len]));  
    }  
    return maxs - mins;  
}  

int main() {  
    IOS  
    cin >> x >> y >> n;  
    for(int i = 1; i <= x; i++) {  
        for(int j = 1; j <= y; j++) {  
            cin >> a[i][j];  
        }  
    }  
    ini();  
    ST();  

    ll ans = LLONG_MAX;  
    for(int i = 1; i <= x - n + 1; i++) {  
        for(int j = 1; j <= y - n + 1; j++) {  
            ll tmp = RMQ(i, j, n);  
            ans = min(ans, tmp);  
        }  
    }  
    cout << ans;  
    return 0;  
}
2025/1/24 15:37
加载中...