60pts MLE?! 不能理解
查看原帖
60pts MLE?! 不能理解
126972
Kevinx楼主2023/11/3 22:15

60pts

#include<bits/stdc++.h>
#define ll int
using namespace std;
const int N = (1e3 + 20);
//ll sta;
ll n, m, k;
ll log_2[N];
ll st1[N][N][20];//max
ll st2[N][N][20];//min
//ll end;
int main(){
//    cerr << double(&end - &sta) /1024 / 1024;
     memset(st2, 125, sizeof(st2));
     ll minn = st2[0][0][0];
     ll INF = minn;
     scanf("%d%d%d", &n, &m, &k);
//     swap(n, m);
     log_2[1] = 0, log_2[2] = 1;
     for(ll i = 3; i <= k; i++) log_2[i] = log_2[i/2] + 1;
	 for(ll i = 1; i <= n; i++) {
	 	for(ll j = 1; j <= m; j++) {
	 		scanf("%d", &st1[i][j][0]);
	 		st2[i][j][0] = st1[i][j][0];
		 }
	 }
	 
	 for(ll len = 1; len <= 11; len++) {
	 	for(ll i = 1; i + (1 << (len)) - 1 <= n; i++) {
	 		for(ll j = 1; j + (1 << (len)) - 1 <= m; j++) {
	 		    ll D = (1 << (len - 1));
	 		    ll K = len - 1;
//	 		    if(i + D >= n || j + D >= m) continue;
	 			st1[i][j][len] = max(max(st1[i][j][K], st1[i + D][j + D][K]), max(st1[i][j + D][K], st1[i + D][j][K]));
	 			st2[i][j][len] = min(min(st2[i][j][K], st2[i + D][j + D][K]), min(st2[i][j + D][K], st2[i + D][j][K]));
			 }
		 }
	 }
//	 cout << st2[2][1][0];
	 for(ll i = 1;  i + (k - 1) <= n; i++) {
	 	for(ll j = 1; j + (k - 1) <= m; j++) {
	 		ll x = i + k, y = j + k;
	 		ll K = log_2[k];
	 		ll D = (1 << K);
	 		if(x - D < 0 || y - D < 0) continue;
	 		ll Maxx = max(max(st1[i][j][K], st1[x - D][y - D][K]), max(st1[i][y - D][K], st1[x - D][j][K]));
	 		ll Minn = min(min(st2[i][j][K], st2[x - D][y - D][K]), min(st2[i][y - D][K], st2[x - D][j][K]));
/*
	 		cout << i << " " << j << endl;
	 		cout << x-D << " " << y-D << endl;
	 		cout << i << " " << y-D << endl;
	 		cout << x-D << " " << j << endl;
	 		cout << "------\n";
*/
	 		if(Minn == INF) continue;
	 		ll ans = Maxx - Minn;
	 		minn = min(minn, ans);
//	 		cout << ans;
		 }
	 }
	 cout << minn;
	 
    return 0;
}
2023/11/3 22:15
加载中...