結果
| 問題 |
No.2354 Poor Sight in Winter
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-07-13 18:46:10 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,958 bytes |
| コンパイル時間 | 4,640 ms |
| コンパイル使用メモリ | 284,352 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-13 18:46:18 |
| 合計ジャッジ時間 | 7,462 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 14 WA * 9 RE * 3 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
const int MOD = 998244353;
bool check(int x, int n, int k, int sx, int sy, int gx, int gy, vector<pair<int, int>> &lamps) {
int ans = 1e18;
vector<int> dp(n, 1e9);
for (int i = n - 1; i >= 0; i--) {
if(lamps[i].first > gx) {
continue;
}
int dist = abs(lamps[i].first - gx) + abs(lamps[i].second - gy);
dp[i] = max((dist / x) - (dist % x == 0), 0LL);
for (int j = i + 1; j < n; j++) {
int dist = abs(lamps[j].first - lamps[i].first) + abs(lamps[j].second - lamps[i].second);
dp[i] = min(dp[i], dp[j] + max((dist / x) - (dist % x == 0), 0LL));
}
int temp = 0;
dist = abs(lamps[i].first - sx) + abs(lamps[i].second - sy);
temp = max((dist / x) - (dist % x == 0), 0LL);
ans = min(ans, temp + dp[i]);
}
return ans <= k;
}
// int binary_search(int l, int r) {
// while (l < r) {
// int m = l + (r - l) / 2;
// if (check(m)) {
// r = m;
// } else {
// l = m + 1;
// }
// }
// return l;
// }
void solve() {
int n, k; cin >> n >> k;
int sx, sy, gx, gy; cin >> sx >> sy >> gx >> gy;
vector<pair<int, int>> lamps(n);
for (int i = 0; i < n; i++) {
cin >> lamps[i].first >> lamps[i].second;
}
sort(lamps.begin(), lamps.end());
if(sx > gx) {
swap(sx, gx);
swap(sy, gy);
}
int l = 0, r = 200005;
// auto check = [&](int x) -> bool{
// // 1d dp to check if we can reach the destination with x visibility
// int ans = 1e18;
// vector<int> dp(n, 0);
// for (int i = n - 1; i >= 0; i--) {
// int dist = abs(lamps[i].first - gx) + abs(lamps[i].second - gy);
// if(dist > x) {
// dp[i] = (dist / (2 * x)) + (dist % (2 * x) != 0);
// }
// for (int j = i + 1; j < n; j++) {
// int dist = abs(lamps[j].first - lamps[i].first) + abs(lamps[j].second - lamps[i].second);
// if(dist > x) {
// dp[i] = max(dp[i], dp[j] + (dist / (2 * x)) + (dist % (2 * x) != 0));
// }
// }
// int temp = 0;
// dist = abs(lamps[i].first - sx) + abs(lamps[i].second - sy);
// if(dist > x) {
// temp = (dist / (2 * x)) + (dist % (2 * x) != 0);
// }
// ans = min(ans, temp + dp[i]);
// }
// return ans <= k;
// };
while (l < r) {
int m = l + (r - l) / 2;
if (check(m, n, k, sx, sy, gx, gy, lamps)) {
r = m;
} else {
l = m + 1;
}
}
cout << l << endl;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T = 1;
// cin >> T;
while (T--) {
solve();
}
return 0;
}