답안 #68281

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
68281 2018-08-16T11:05:40 Z BThero The Kingdom of JOIOI (JOI17_joioi) C++17
15 / 100
40 ms 5044 KB
// Why I am so dumb? :c
#include <bits/stdc++.h>

#define pb push_back
#define mp make_pair

#define all(x) (x).begin(), (x).end()

#define fi first
#define se second

using namespace std;

typedef long long ll;

const int MAXN = (int)2e3 + 3;

pair<int, int> pref[MAXN][MAXN];

pair<int, int> suff[MAXN][MAXN];

int newArr[MAXN][MAXN];

int arr[MAXN][MAXN];

int rl[MAXN * MAXN];

int n, m, k, ans;

void compress() {
	vector<int> vv;

	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			vv.pb(arr[i][j]);
		}
	}

	sort(all(vv));
	vv.resize(unique(all(vv)) - vv.begin());

	k = vv.size();

	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			int ps = upper_bound(all(vv), arr[i][j]) - vv.begin();
			rl[ps] = arr[i][j];
			arr[i][j] = ps;
		}
	}
}

bool goPrefL(int lim) {
	int ptr = m, cur = 0, cur2 = 0;

    for (int i = 1; i <= n; ++i) {
    	while (ptr > 0 && pref[i][ptr].se < lim) {
    		--ptr;
    	}

    	if (ptr < 1) {
    		break;
    	}

    	cur = max(cur, pref[i][ptr].fi);

    	if (ptr < m) {
    		cur2 = max(cur2, suff[i][ptr + 1].fi);
    	}
    }

    if (ptr > 0 && cur == k) {
    	ans = min(ans, max(rl[k] - rl[lim], rl[cur2] - rl[1]));
    	return 1;
    }	
    
    return 0;
}

bool goSuffL(int lim) {
	int ptr = 1, cur = 0, cur2 = 0;

    for (int i = 1; i <= n; ++i) {
    	while (ptr <= m && suff[i][ptr].se < lim) {
    		++ptr;
    	}

    	if (ptr > m) {
    		break;
    	}

    	cur = max(cur, suff[i][ptr].fi);

    	if (ptr > 1) {
    		cur2 = max(cur2, pref[i][ptr - 1].fi);
    	}
    }

    if (ptr <= m && cur == k) {
    	ans = min(ans, max(rl[k] - rl[lim], rl[cur2] - rl[1]));
    	return 1;
    }	
    
    return 0;
}

bool goPrefR(int lim) {
	int ptr = m, cur = k + 1, cur2 = k + 1;
			
    for (int i = 1; i <= n; ++i) {
    	while (ptr > 0 && pref[i][ptr].fi > lim) {
    		--ptr;
    	}

    	if (ptr < 1) {
    		break;
    	}

    	cur = min(cur, pref[i][ptr].se);

    	if (ptr < m) {
    		cur2 = min(cur2, suff[i][ptr + 1].se);
    	}
    }

    if (ptr > 0 && cur == 1) {
    	ans = min(ans, max(rl[lim] - rl[1], rl[k] - rl[cur2]));
    	return 1;
	}

	return 0;
}

bool goSuffR(int lim) {
    int ptr = 1, cur = k + 1, cur2 = k + 1;

    for (int i = 1; i <= n; ++i) {
    	while (ptr <= m && suff[i][ptr].fi > lim) {
    		++ptr;
    	}

    	if (ptr > m) {
    		break;
    	}

    	cur = min(cur, suff[i][ptr].se);

    	if (ptr > 1) {
    		cur2 = min(cur2, pref[i][ptr - 1].se);
    	}
    }

    if (ptr <= m && cur == 1) {
    	ans = min(ans, max(rl[lim] - rl[1], rl[k] - rl[cur2]));
    	return 1;
    }	

    return 0;
}

void solve() {                   
	scanf("%d %d", &n, &m);

    for (int i = 1; i <= n; ++i) {
    	for (int j = 1; j <= m; ++j) {
    		scanf("%d", &arr[i][j]);
    	}
    }

    compress();
    // fi -> max, se -> min

    ans = rl[k] - rl[1];

    for (int step = 0; step < 4; ++step) {    	
    	for (int i = 1; i <= n; ++i) {
    		pref[i][1] = mp(arr[i][1], arr[i][1]);
    		suff[i][m] = mp(arr[i][m], arr[i][m]);

    		for (int j = 2; j <= m; ++j) {              
    			pref[i][j].fi = max(pref[i][j - 1].fi, arr[i][j]);
    			pref[i][j].se = min(pref[i][j - 1].se, arr[i][j]);
    		}

    		for (int j = m - 1; j > 0; --j) {
    			suff[i][j].fi = max(suff[i][j + 1].fi, arr[i][j]);
    			suff[i][j].se = min(suff[i][j + 1].se, arr[i][j]);
    		}
    	}    	

    	{
    		int l = 2, r = k;

    		while (l <= r) {
    			int mid = (l + r) >> 1;

    			if (!goPrefL(mid)) {
    				r = mid - 1;
    			}
    			else {
    				l = mid + 1;
    			}
    		}
    	}

    	{
    		int l = 2, r = k;

    		while (l <= r) {
    			int mid = (l + r) >> 1;

    			if (!goSuffL(mid)) {
    				r = mid - 1;
    			}
    			else {
    				l = mid + 1;
    			}
    		}
    	}

     	

    	{
    		int cur = k - 1;

    		for (int i = 10; i >= 0; --i) {
    			if (cur > (1 << i)) {
    				if (goPrefR(cur - (1 << i))) {
    					cur -= (1 << i);
    				}
    			}
    		}

    		goPrefR(cur);
    	}            	    	

    	for (int i = k - 1; i > 0; --i) {
    		if (!goSuffR(i)) {
    			break;
    		}
    	}
		
		// rotate array

		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m; ++j) {
				newArr[m - j + 1][i] = arr[i][j];
			}
		}

		swap(n, m);

		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m; ++j) {
				arr[i][j] = newArr[i][j];
			}
		}
    }

    printf("%d\n", ans);
}

int main() {    
    int tt = 1;

    while (tt--) {
        solve();
    }

    return 0;
}

Compilation message

joioi.cpp: In function 'void solve()':
joioi.cpp:162:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~~
joioi.cpp:166:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d", &arr[i][j]);
       ~~~~~^~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 504 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 584 KB Output is correct
4 Correct 3 ms 764 KB Output is correct
5 Correct 2 ms 764 KB Output is correct
6 Correct 3 ms 764 KB Output is correct
7 Correct 2 ms 764 KB Output is correct
8 Correct 2 ms 764 KB Output is correct
9 Correct 3 ms 864 KB Output is correct
10 Correct 3 ms 868 KB Output is correct
11 Correct 2 ms 868 KB Output is correct
12 Correct 2 ms 868 KB Output is correct
13 Correct 3 ms 868 KB Output is correct
14 Correct 3 ms 868 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 504 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 584 KB Output is correct
4 Correct 3 ms 764 KB Output is correct
5 Correct 2 ms 764 KB Output is correct
6 Correct 3 ms 764 KB Output is correct
7 Correct 2 ms 764 KB Output is correct
8 Correct 2 ms 764 KB Output is correct
9 Correct 3 ms 864 KB Output is correct
10 Correct 3 ms 868 KB Output is correct
11 Correct 2 ms 868 KB Output is correct
12 Correct 2 ms 868 KB Output is correct
13 Correct 3 ms 868 KB Output is correct
14 Correct 3 ms 868 KB Output is correct
15 Correct 5 ms 3948 KB Output is correct
16 Correct 12 ms 4808 KB Output is correct
17 Correct 22 ms 4924 KB Output is correct
18 Correct 36 ms 4960 KB Output is correct
19 Correct 36 ms 4996 KB Output is correct
20 Correct 25 ms 5044 KB Output is correct
21 Correct 23 ms 5044 KB Output is correct
22 Correct 40 ms 5044 KB Output is correct
23 Incorrect 34 ms 5044 KB Output isn't correct
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 504 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 584 KB Output is correct
4 Correct 3 ms 764 KB Output is correct
5 Correct 2 ms 764 KB Output is correct
6 Correct 3 ms 764 KB Output is correct
7 Correct 2 ms 764 KB Output is correct
8 Correct 2 ms 764 KB Output is correct
9 Correct 3 ms 864 KB Output is correct
10 Correct 3 ms 868 KB Output is correct
11 Correct 2 ms 868 KB Output is correct
12 Correct 2 ms 868 KB Output is correct
13 Correct 3 ms 868 KB Output is correct
14 Correct 3 ms 868 KB Output is correct
15 Correct 5 ms 3948 KB Output is correct
16 Correct 12 ms 4808 KB Output is correct
17 Correct 22 ms 4924 KB Output is correct
18 Correct 36 ms 4960 KB Output is correct
19 Correct 36 ms 4996 KB Output is correct
20 Correct 25 ms 5044 KB Output is correct
21 Correct 23 ms 5044 KB Output is correct
22 Correct 40 ms 5044 KB Output is correct
23 Incorrect 34 ms 5044 KB Output isn't correct
24 Halted 0 ms 0 KB -