結果
| 問題 | No.3639 Itsukin |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-25 14:40:07 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 542 ms / 2,000 ms |
| + 522µs | |
| コード長 | 1,540 bytes |
| 記録 | |
| コンパイル時間 | 2,527 ms |
| コンパイル使用メモリ | 350,244 KB |
| 実行使用メモリ | 20,068 KB |
| 最終ジャッジ日時 | 2026-08-25 14:40:29 |
| 合計ジャッジ時間 | 13,158 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| サンプル | 0 % | AC * 1 |
| 小課題1 | 10 % | AC * 6 |
| 小課題2 | 15 % | AC * 5 |
| 小課題3 | 15 % | AC * 16 |
| 小課題4 | 20 % | AC * 10 |
| 小課題5 | 10 % | AC * 15 |
| 小課題6 | 30 % | AC * 35 |
| 合計 | 100 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct UnionFind {
std::vector<int> data;
UnionFind() = default;
explicit UnionFind(std::size_t sz) : data(sz, -1) {}
bool unite(int x, int y) {
x = find(x), y = find(y);
if (x == y) return false;
if (data[x] > data[y]) std::swap(x, y);
data[x] += data[y];
data[y] = x;
return true;
}
int find(int k) {
if (data[k] < 0) return (k);
return data[k] = find(data[k]);
}
int size(int k) { return -data[find(k)]; }
bool same(int x, int y) { return find(x) == find(y); }
std::vector<std::vector<int>> groups() {
int n = (int)data.size();
std::vector<std::vector<int>> ret(n);
for (int i = 0; i < n; i++) {
ret[find(i)].emplace_back(i);
}
ret.erase(
std::remove_if(ret.begin(), ret.end(),
[&](const std::vector<int>& v) { return v.empty(); }),
ret.end());
return ret;
}
};
// これ好き
int main() {
int n, m; cin >> n >> m;
using Query = tuple<int, int, int, int>;
vector<Query> events;
for (int i = 0; i < m; ++i) {
int u, v, l; cin >> u >> v >> l; --u; --v;
events.push_back({l, 0, u, v});
}
int q; cin >> q;
for (int qi = 0; qi < q; ++qi) {
int p, t; cin >> p >> t; --t;
events.push_back({p, 1, t, qi});
}
sort(events.begin(), events.end());
UnionFind uf(n);
vector<int> ans(q);
for (auto [w, x, y, z] : events) {
if (x == 0) {
uf.unite(y, z);
}
if (x == 1) {
ans[z] = uf.size(y);
}
}
for (int a : ans) cout << a << endl;
}