#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <iostream>
#include <cassert>
#include <cmath>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <cstdlib>
using namespace std;
#define INF 1e+9
#define mp make_pair
#define pb push_back
#define fi first
#define fs first
#define se second
#define i64 long long
#define li long long
#define lint long long
#define pii pair<int, int>
#define vi vector<int>
#define forn(i, n) for (int i = 0; i < (int)n; i++)
#define fore(i, b, e) for (int i = (int)b; i <= (int)e; i++)
const int maxn = 2005;
const int inf = 1e9+7;
pii prec[maxn][maxn];
int n, m;
int a[maxn][maxn];
int b[maxn][maxn];
int global_min, global_max;
multiset<int> right_part_full;
struct Event {
int minn, row, diff;
};
bool operator < (Event fi, Event se) {
return fi.minn < se.minn;
}
bool check(int delta) {
//fprintf(stderr, "check %d\n", delta);
vector<Event> events;
vi app_limits(m, -inf);
vi dis_limits(m, inf);
forn(i, n) {
int cur_app = -inf;
int cur_dis = inf;
forn(j, m) {
//min <= x <= min + delta
cur_app = max(cur_app, a[i][j] - delta);
cur_app = max(cur_app, app_limits[j]);
app_limits[j] = max(app_limits[j], cur_app);
cur_dis = min(cur_dis, a[i][j] + 1);
cur_dis = min(cur_dis, dis_limits[j]);
dis_limits[j] = min(dis_limits[j], cur_dis);
if (cur_app < cur_dis) {
events.pb({cur_app, i, +1});
events.pb({cur_dis, i, -1});
}
}
}
sort(events.begin(), events.end());
/*for (auto e : events) {
fprintf(stderr, "event minn = %d row = %d diff = %d\n", e.minn, e.row, e.diff);
}*/
multiset<int> right_part = right_part_full;
/*for (int x : right_part) {
printf("start %d\n", x);
}*/
size_t pointer = 0;
vi rows(n);
while(pointer < events.size()) {
int minn = events[pointer].minn;
//printf("minn = %d\n", minn);
while(pointer < events.size() && events[pointer].minn == minn) {
int row = events[pointer].row;
/*if (rows[row] != m) {
right_part.erase(right_part.find(prec[row][rows[row]].fi));
right_part.erase(right_part.find(prec[row][rows[row]].se));
}*/
rows[row] += events[pointer].diff;
if (events[pointer].diff == +1) {
right_part.erase(right_part.find(a[row][rows[row] - 1]));
}
else
right_part.insert(a[row][rows[row]]);
/*if (rows[row] != m) {
right_part.insert(prec[row][rows[row]].fi);
right_part.insert(prec[row][rows[row]].se);
}*/
pointer++;
}
/*for (int x : right_part) {
printf("now %d\n", x);
}*/
/*printf("minn = %d\n", minn);
forn(i, n)
printf("rows[%d] = %d\n", i, rows[i]);*/
if (right_part.empty())
return true;
int right_min = *right_part.begin();
int right_max = *right_part.rbegin();
if (right_max - right_min <= delta)
return true;
}
return false;
}
int solve(int upper_bound) {
forn(i, n) {
prec[i][m] = {inf, -inf};
for (int len = m - 1; len >= 0; --len) {
prec[i][len] = {min(prec[i][len + 1].fi, a[i][len]),
max(prec[i][len + 1].se, a[i][len])};
//printf("prec[%d][%d] = %d %d\n", i, len, prec[i][len].fi, prec[i][len].se);
}
}
int start = 0;
int finish = upper_bound;
while(start < finish) {
int middle = (start + finish) / 2;
if (check(middle)) {
finish = middle;
} else {
start = middle + 1;
}
}
return start;
}
int main() {
#ifdef LOCAL
freopen("inp", "r", stdin);
//freopen("outp", "w", stdout);
#else
// freopen(TASKNAME ".in", "r", stdin);
// freopen(TASKNAME ".out", "w", stdout);
#endif
scanf("%d%d", &n, &m);
global_min = inf;
global_max = -inf;
forn(i, n)
forn(j, m) {
scanf("%d", &a[i][j]);
global_min = min(global_min, a[i][j]);
global_max = max(global_max, a[i][j]);
}
forn(i, n)
forn(j, m)
right_part_full.insert(a[i][j]);
int first = solve(global_max - global_min);
forn(i, n)
forn(j, m)
b[n - i - 1][j] = a[i][j];
memcpy(a, b, sizeof(b));
/*forn(i, n) {
forn(j, m)
printf("%d ", b[i][j]);
printf("\n");
}*/
int second = solve(first);
//printf("first = %d second = %d\n", first, second);
printf("%d", min(first, second));
}
Compilation message
joioi.cpp: In function 'int main()':
joioi.cpp:152:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &n, &m);
~~~~~^~~~~~~~~~~~~~~~
joioi.cpp:157:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &a[i][j]);
~~~~~^~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
16120 KB |
Output is correct |
2 |
Correct |
18 ms |
16228 KB |
Output is correct |
3 |
Correct |
20 ms |
16432 KB |
Output is correct |
4 |
Correct |
18 ms |
16432 KB |
Output is correct |
5 |
Correct |
19 ms |
16432 KB |
Output is correct |
6 |
Correct |
20 ms |
16432 KB |
Output is correct |
7 |
Correct |
20 ms |
16432 KB |
Output is correct |
8 |
Correct |
20 ms |
16432 KB |
Output is correct |
9 |
Correct |
20 ms |
16432 KB |
Output is correct |
10 |
Correct |
20 ms |
16432 KB |
Output is correct |
11 |
Correct |
21 ms |
16488 KB |
Output is correct |
12 |
Correct |
21 ms |
16488 KB |
Output is correct |
13 |
Correct |
21 ms |
16488 KB |
Output is correct |
14 |
Correct |
22 ms |
16488 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
16120 KB |
Output is correct |
2 |
Correct |
18 ms |
16228 KB |
Output is correct |
3 |
Correct |
20 ms |
16432 KB |
Output is correct |
4 |
Correct |
18 ms |
16432 KB |
Output is correct |
5 |
Correct |
19 ms |
16432 KB |
Output is correct |
6 |
Correct |
20 ms |
16432 KB |
Output is correct |
7 |
Correct |
20 ms |
16432 KB |
Output is correct |
8 |
Correct |
20 ms |
16432 KB |
Output is correct |
9 |
Correct |
20 ms |
16432 KB |
Output is correct |
10 |
Correct |
20 ms |
16432 KB |
Output is correct |
11 |
Correct |
21 ms |
16488 KB |
Output is correct |
12 |
Correct |
21 ms |
16488 KB |
Output is correct |
13 |
Correct |
21 ms |
16488 KB |
Output is correct |
14 |
Correct |
22 ms |
16488 KB |
Output is correct |
15 |
Correct |
25 ms |
16592 KB |
Output is correct |
16 |
Correct |
47 ms |
21896 KB |
Output is correct |
17 |
Correct |
489 ms |
22876 KB |
Output is correct |
18 |
Correct |
388 ms |
22876 KB |
Output is correct |
19 |
Correct |
411 ms |
22876 KB |
Output is correct |
20 |
Correct |
367 ms |
22876 KB |
Output is correct |
21 |
Correct |
960 ms |
23208 KB |
Output is correct |
22 |
Correct |
548 ms |
23208 KB |
Output is correct |
23 |
Correct |
730 ms |
23208 KB |
Output is correct |
24 |
Correct |
464 ms |
23208 KB |
Output is correct |
25 |
Correct |
987 ms |
23208 KB |
Output is correct |
26 |
Correct |
885 ms |
23208 KB |
Output is correct |
27 |
Correct |
784 ms |
23208 KB |
Output is correct |
28 |
Correct |
1027 ms |
23208 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
16120 KB |
Output is correct |
2 |
Correct |
18 ms |
16228 KB |
Output is correct |
3 |
Correct |
20 ms |
16432 KB |
Output is correct |
4 |
Correct |
18 ms |
16432 KB |
Output is correct |
5 |
Correct |
19 ms |
16432 KB |
Output is correct |
6 |
Correct |
20 ms |
16432 KB |
Output is correct |
7 |
Correct |
20 ms |
16432 KB |
Output is correct |
8 |
Correct |
20 ms |
16432 KB |
Output is correct |
9 |
Correct |
20 ms |
16432 KB |
Output is correct |
10 |
Correct |
20 ms |
16432 KB |
Output is correct |
11 |
Correct |
21 ms |
16488 KB |
Output is correct |
12 |
Correct |
21 ms |
16488 KB |
Output is correct |
13 |
Correct |
21 ms |
16488 KB |
Output is correct |
14 |
Correct |
22 ms |
16488 KB |
Output is correct |
15 |
Correct |
25 ms |
16592 KB |
Output is correct |
16 |
Correct |
47 ms |
21896 KB |
Output is correct |
17 |
Correct |
489 ms |
22876 KB |
Output is correct |
18 |
Correct |
388 ms |
22876 KB |
Output is correct |
19 |
Correct |
411 ms |
22876 KB |
Output is correct |
20 |
Correct |
367 ms |
22876 KB |
Output is correct |
21 |
Correct |
960 ms |
23208 KB |
Output is correct |
22 |
Correct |
548 ms |
23208 KB |
Output is correct |
23 |
Correct |
730 ms |
23208 KB |
Output is correct |
24 |
Correct |
464 ms |
23208 KB |
Output is correct |
25 |
Correct |
987 ms |
23208 KB |
Output is correct |
26 |
Correct |
885 ms |
23208 KB |
Output is correct |
27 |
Correct |
784 ms |
23208 KB |
Output is correct |
28 |
Correct |
1027 ms |
23208 KB |
Output is correct |
29 |
Execution timed out |
4022 ms |
119684 KB |
Time limit exceeded |
30 |
Halted |
0 ms |
0 KB |
- |