結果
| 問題 |
No.2157 崖
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2022-12-09 21:54:51 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,716 ms / 6,000 ms |
| コード長 | 1,235 bytes |
| コンパイル時間 | 1,831 ms |
| コンパイル使用メモリ | 178,840 KB |
| 実行使用メモリ | 27,648 KB |
| 最終ジャッジ日時 | 2024-10-14 21:47:41 |
| 合計ジャッジ時間 | 17,587 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 22 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
int main(){
int N, M;
cin >> N >> M;
vector<vector<int>> D(N, vector<int>(M));
for (int i = 0; i < N; i++){
for (int j = 0; j < M; j++){
cin >> D[i][j];
}
}
vector<pair<int, int>> P(N * M);
for (int i = 0; i < N; i++){
for (int j = 0; j < M; j++){
P[i * M + j] = make_pair(D[i][j], i);
}
}
sort(P.begin(), P.end());
int tv = INF, fv = -1;
while (tv - fv > 1){
int mid = (tv + fv) / 2;
vector<bool> dp(N * M, false);
vector<int> S(N, 0);
int p = 0;
for (int i = 0; i < N * M; i++){
while (P[i].first - P[p].first > mid){
if (dp[p]){
S[P[p].second]--;
}
p++;
}
if (P[i].second == 0){
dp[i] = true;
} else {
if (S[P[i].second - 1] > 0){
dp[i] = true;
}
}
if (dp[i]){
S[P[i].second]++;
}
}
bool ok = false;
for (int i = 0; i < N * M; i++){
if (P[i].second == N - 1 && dp[i]){
ok = true;
}
}
if (ok){
tv = mid;
} else {
fv = mid;
}
}
if (tv == INF){
cout << -1 << endl;
} else {
cout << tv << endl;
}
}
SSRS