結果
| 問題 | No.3756 Udon Network |
| ユーザー |
|
| 提出日時 | 2026-09-12 16:56:04 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
RE
不安定
|
| 実行時間 | - |
| コード長 | 1,756 bytes |
| 記録 | |
| コンパイル時間 | 2,178 ms |
| コンパイル使用メモリ | 356,976 KB |
| 実行使用メモリ | 9,920 KB |
| 最終ジャッジ日時 | 2026-10-09 17:45:35 |
| 合計ジャッジ時間 | 12,877 ms |
|
ジャッジサーバーID (参考情報) |
judge5_0 / judge4_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| Example | 0 % | AC * 8 |
| Subtask $1$ | 2 % | AC * 15 |
| Subtask $2$ | 4 % | AC * 22 |
| Subtask $3$ | 8 % | AC * 3 RE * 6 |
| Subtask $4$ | 16 % | AC * 2 RE * 8 |
| Subtask $5$ | 32 % | AC * 3 RE * 7 |
| Subtask $6$ | 38 % | AC * 22 RE * 31 |
| 合計 | 4 * 6% = 24 点 |
ソースコード
// O(Qlog M(N + M))
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#ifdef LOCAL
#include <debug.hpp>
#else
#define debug(...)
#endif
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(20);
int N, M, Q;
cin >> N >> M >> Q;
assert(N <= 1000 && M <= 1000 && Q <= 5000);
vector<int> A(N), W;
for (int i = 0; i < N; i++) cin >> A[i], A[i]--;
vector<vector<pair<int, int>>> G(N);
for (int i = 0; i < M; i++) {
int u, v, w;
cin >> u >> v >> w, u--, v--;
W.emplace_back(w);
G[u].emplace_back(v, w);
G[v].emplace_back(u, w);
}
ranges::sort(W);
W.erase(ranges::unique(W).begin(), W.end());
auto solve = [&](int s, int c) -> int {
if (c == 1) return 0; // 店 s 到達で ok
int ok = ssize(W), ng = -1;
while (ok - ng > 1) {
int mid = midpoint(ok, ng);
vector<int> seen(N), K(N);
queue<int> que;
seen[s] = true;
K[A[s]] = true;
que.emplace(s);
while (!que.empty()) {
int v = que.front();
que.pop();
for (auto [u, w] : G[v]) {
if (seen[u] || W[mid] < w) continue;
seen[u] = true;
K[A[u]] = true;
que.emplace(u);
}
}
int cnt = 0;
for (int i = 0; i < N; i++) {
if (K[i]) cnt++;
}
(cnt >= c ? ok : ng) = mid;
}
return (ok == ssize(W) ? -1 : W[ok]);
};
while (Q--) {
int s, c;
cin >> s >> c, s--;
cout << solve(s, c) << "\n";
}
}