Submission #47553082
Source Code Expand
#include <bits/stdc++.h>
#include <atcoder/modint>
namespace {
using ModInt [[maybe_unused]] = atcoder::modint998244353;
using Num [[maybe_unused]] = long long int;
using Vec [[maybe_unused]] = std::vector<Num>;
using Set [[maybe_unused]] = std::set<Num>;
using Mset [[maybe_unused]] = std::multiset<Num>;
using Edges [[maybe_unused]] = std::vector<std::vector<Num>>;
template<typename T>
using Q [[maybe_unused]] = std::queue<T>;
template<typename T>
using PQ [[maybe_unused]] = std::priority_queue<T, std::vector<T>, std::greater<T>>;
}
// Based on
// https://scrapbox.io/sifi-algo/Quick_Find
struct QuickFind {
std::vector<Num> leaders_;
std::vector<std::vector<Num>> members_;
std::vector<Num> potentials_;
QuickFind(Num n_nodes) :
leaders_(n_nodes, 0), members_(n_nodes), potentials_(n_nodes, 0) {
std::iota(leaders_.begin(), leaders_.end(), Num{0});
for(Num i{0}; i<n_nodes; ++i) {
members_.at(i).push_back(i);
}
}
Num leader(Num x) {
return leaders_.at(x);
}
void merge(Num x, Num y, Num potential) {
auto p = potential;
p += potentials_.at(x);
p -= potentials_.at(y);
auto leader_x = leaders_.at(x);
auto leader_y = leaders_.at(y);
if (leader_x == leader_y) {
return;
}
if (members_.at(leader_x).size() < members_.at(leader_y).size()) {
std::swap(leader_x, leader_y);
p = -p;
}
for(const auto& v : members_.at(leader_y)) {
leaders_.at(v) = leader_x;
potentials_.at(v) += p;
}
members_.at(leader_x).insert(
members_.at(leader_x).end(),
members_.at(leader_y).begin(), members_.at(leader_y).end());
std::vector<Num> zero;
std::swap(zero, members_.at(leader_y));
return;
}
Num potential(Num x) {
return potentials_.at(x);
}
bool same(Num x, Num y) {
return leader(x) == leader(y);
}
Num diff(Num x, Num y) {
return potentials_.at(y) - potentials_.at(x);
}
};
void solve(std::istream& is, std::ostream& os) {
Num n, q;
is >> n >> q;
Vec answer;
QuickFind dsu(n);
for(Num i{1}; i<=q; ++i) {
Num a, b, d;
is >> b >> a >> d;
--a;
--b;
bool found = dsu.same(a, b);
if (!found || (dsu.diff(a, b) == d)) {
answer.push_back(i);
}
if (!found) {
dsu.merge(a, b, d);
}
}
const auto size = answer.size();
for(size_t i{0}; i<size; ++i) {
os << answer.at(i);
if ((i+1) == size) {
os << "\n";
} else {
os << " ";
}
}
}
int main(void) {
solve(std::cin, std::cout);
return 0;
}
Submission Info
| Submission Time | |
|---|---|
| Task | F - Good Set Query |
| User | zettsut |
| Language | C++ 20 (gcc 12.2) |
| Score | 525 |
| Code Size | 2943 Byte |
| Status | AC |
| Exec Time | 223 ms |
| Memory | 22300 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 525 / 525 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | example0.txt, example1.txt, example2.txt |
| All | 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, example0.txt, example1.txt, example2.txt, hack_001.txt, hack_002.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 000.txt | AC | 57 ms | 4116 KiB |
| 001.txt | AC | 100 ms | 5292 KiB |
| 002.txt | AC | 104 ms | 19360 KiB |
| 003.txt | AC | 89 ms | 17124 KiB |
| 004.txt | AC | 97 ms | 18256 KiB |
| 005.txt | AC | 145 ms | 19264 KiB |
| 006.txt | AC | 147 ms | 20264 KiB |
| 007.txt | AC | 132 ms | 19316 KiB |
| 008.txt | AC | 132 ms | 20332 KiB |
| 009.txt | AC | 98 ms | 5472 KiB |
| 010.txt | AC | 82 ms | 3548 KiB |
| 011.txt | AC | 82 ms | 4228 KiB |
| 012.txt | AC | 80 ms | 5344 KiB |
| 013.txt | AC | 63 ms | 5256 KiB |
| 014.txt | AC | 84 ms | 3500 KiB |
| 015.txt | AC | 92 ms | 4208 KiB |
| 016.txt | AC | 98 ms | 5272 KiB |
| 017.txt | AC | 69 ms | 5252 KiB |
| 018.txt | AC | 88 ms | 3572 KiB |
| 019.txt | AC | 95 ms | 4168 KiB |
| 020.txt | AC | 103 ms | 5344 KiB |
| 021.txt | AC | 75 ms | 5248 KiB |
| 022.txt | AC | 90 ms | 3908 KiB |
| 023.txt | AC | 98 ms | 4392 KiB |
| 024.txt | AC | 105 ms | 5436 KiB |
| 025.txt | AC | 81 ms | 5440 KiB |
| 026.txt | AC | 97 ms | 5188 KiB |
| 027.txt | AC | 105 ms | 5900 KiB |
| 028.txt | AC | 112 ms | 6948 KiB |
| 029.txt | AC | 95 ms | 6936 KiB |
| 030.txt | AC | 223 ms | 21408 KiB |
| 031.txt | AC | 223 ms | 22300 KiB |
| 032.txt | AC | 223 ms | 21240 KiB |
| 033.txt | AC | 206 ms | 21716 KiB |
| example0.txt | AC | 1 ms | 3556 KiB |
| example1.txt | AC | 11 ms | 17076 KiB |
| example2.txt | AC | 1 ms | 3548 KiB |
| hack_001.txt | AC | 1 ms | 3592 KiB |
| hack_002.txt | AC | 1 ms | 3504 KiB |