結果
| 問題 | No.3754 Mischievous Resident (Hard) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-07 11:28:48 |
| 言語 | C++17 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
MLE
不安定
|
| 実行時間 | - |
| コード長 | 1,933 bytes |
| 記録 | |
| コンパイル時間 | 1,451 ms |
| コンパイル使用メモリ | 232,584 KB |
| 実行使用メモリ | 1,304,340 KB |
| 最終ジャッジ日時 | 2026-10-02 20:52:19 |
| 合計ジャッジ時間 | 4,724 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge4_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 1 MLE * 2 -- * 45 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct VectorHash {
size_t operator()(const vector<int>& v) const {
size_t h = 0;
for (int x : v) {
h ^= hash<int>{}(x) + 0x9e3779b9 + (h << 6) + (h >> 2);
}
return h;
}
};
int brute(int N, const vector<pair<int, int>>& A) {
int M = A.size();
vector<int> S(M), G(M);
for (int i = 0; i < M; ++i) {
S[i] = A[i].first;
G[i] = A[i].second;
}
queue<vector<int>> que;
unordered_map<vector<int>, int, VectorHash> dist;
dist[S] = 0;
que.push(S);
while (!que.empty()) {
auto X = que.front();
que.pop();
int d = dist[X];
if (X == G) {
return d;
}
for (int F = 1; F <= N; ++F) {
int mn = N + 1;
// F に最も近い距離を求める
for (int i = 0; i < M; ++i) {
mn = min(mn, abs(X[i] - F));
}
// 同率最小のエレベーターはすべて選択候補
for (int i = 0; i < M; ++i) {
if (abs(X[i] - F) != mn) continue;
// 動かない遷移は不要
if (X[i] == F) continue;
auto Y = X;
Y[i] = F;
if (!dist.count(Y)) {
dist[Y] = d + 1;
que.push(Y);
}
}
}
}
return -1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int Q;
cin >> Q;
while (Q--) {
int N, M;
cin >> N >> M;
vector<pair<int, int>> A(M);
for (auto& [s, g] : A) cin >> s;
for (auto& [s, g] : A) cin >> g;
// ラベルを付け替えているだけなので、
// (S_i, G_i) ごとソートしても問題ない
sort(A.begin(), A.end());
cout << brute(N, A) << '\n';
}
}