結果
| 問題 |
No.2786 RMQ on Grid Path
|
| コンテスト | |
| ユーザー |
rgnerdplayer
|
| 提出日時 | 2025-05-01 15:40:35 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2,105 ms / 6,000 ms |
| コード長 | 2,905 bytes |
| コンパイル時間 | 4,443 ms |
| コンパイル使用メモリ | 292,508 KB |
| 実行使用メモリ | 25,568 KB |
| 最終ジャッジ日時 | 2025-05-01 15:41:31 |
| 合計ジャッジ時間 | 47,144 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 35 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
struct DSU {
int n, cnt;
vector<int> fa, sz;
DSU(int n = 0) {
init(n);
}
void init(int n_) {
n = cnt = n_;
fa.assign(n, 0);
iota(fa.begin(), fa.end(), 0);
sz.assign(n, 1);
}
int find(int u) {
return u == fa[u] ? u : fa[u] = find(fa[u]);
}
bool join(int u, int v) {
u = find(u), v = find(v);
if (u != v) {
// if (sz[u] < sz[v]) { swap(u, v); }
sz[u] += sz[v];
fa[v] = u;
cnt--;
return true;
}
return false;
}
bool same(int u, int v) {
return find(u) == find(v);
}
int size(int u) {
return sz[find(u)];
}
};
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
auto solve = [&]() {
int n, m;
cin >> n >> m;
vector a(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
int q;
cin >> q;
vector<int> rs(q), cs(q), rt(q), ct(q);
for (int i = 0; i < q; i++) {
cin >> rs[i] >> cs[i] >> rt[i] >> ct[i];
rs[i]--, cs[i]--, rt[i]--, ct[i]--;
}
vector<int> low(q, 1), high(q, n * m);
while (true) {
vector<array<int, 4>> events;
for (int i = 0; i < q; i++) {
if (low[i] != high[i]) {
events.push_back({(low[i] + high[i]) / 2, 1, i});
}
}
if (events.empty()) {
break;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
events.push_back({a[i][j], 0, i, j});
}
}
sort(events.begin(), events.end());
DSU dsu(n * m);
for (auto [x, op, i, j] : events) {
if (op == 0) {
for (auto [di, dj] : {pair(1, 0), {0, 1}, {-1, 0}, {0, -1}}) {
int ni = i + di, nj = j + dj;
if (0 <= ni && ni < n && 0 <= nj && nj < m && a[ni][nj] <= x) {
int u = i * m + j;
int v = ni * m + nj;
dsu.join(u, v);
}
}
} else {
int u = rs[i] * m + cs[i];
int v = rt[i] * m + ct[i];
if (dsu.same(u, v)) {
high[i] = x;
} else {
low[i] = x + 1;
}
}
}
}
for (int i = 0; i < q; i++) {
cout << low[i] << '\n';
}
};
solve();
return 0;
}
rgnerdplayer