Submission #47550446


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://qiita.com/drken/items/cce6fc5c579051e64fab
struct WeightedUnionFind {
    std::vector<Num> parents_;
	std::vector<Num> sizes_;
	std::vector<Num> potentials_;

	WeightedUnionFind(Num n_nodes) :
        parents_(n_nodes, 0), sizes_(n_nodes, 0), potentials_(n_nodes, 0) {
        std::iota(parents_.begin(), parents_.end(), Num{0});
	}

	Num leader(Num x) {
		if (parents_.at(x) == x) {
			return x;
		}

        const auto root = leader(parents_.at(x));
        potentials_.at(x) += potentials_.at(parents_.at(x));
        parents_.at(x) = root;
        return root;
	}

	Num potential(Num x) {
		leader(x);
		return potentials_.at(x);
	}

	bool same(Num x, Num y) {
		return leader(x) == leader(y);
	}

	void merge(Num x, Num y, Num potential) {
        auto p = potential;
		p += potentials_.at(x);
        p -= potentials_.at(y);

		auto leader_x = leader(x);
		auto leader_y = leader(y);
		if (leader_x == leader_y) {
            return;
        }

		if (sizes_.at(leader_x) < sizes_.at(leader_y)) {
            std::swap(leader_x, leader_y);
            p = -p;
        }

		if (sizes_.at(leader_x) == sizes_.at(leader_y)) {
            sizes_.at(leader_x) += 1;
        }

		parents_.at(leader_y) = leader_x;
		potentials_.at(leader_y) = p;
		return;
	}

	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;
    WeightedUnionFind 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 2736 Byte
Status AC
Exec Time 144 ms
Memory 10096 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 525 / 525
Status
AC × 3
AC × 39
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 60 ms 4148 KiB
001.txt AC 103 ms 5156 KiB
002.txt AC 97 ms 9912 KiB
003.txt AC 83 ms 7900 KiB
004.txt AC 91 ms 8888 KiB
005.txt AC 142 ms 9996 KiB
006.txt AC 137 ms 10096 KiB
007.txt AC 120 ms 9928 KiB
008.txt AC 121 ms 9852 KiB
009.txt AC 101 ms 5260 KiB
010.txt AC 86 ms 3424 KiB
011.txt AC 85 ms 4184 KiB
012.txt AC 83 ms 5196 KiB
013.txt AC 65 ms 5224 KiB
014.txt AC 87 ms 3468 KiB
015.txt AC 95 ms 4200 KiB
016.txt AC 100 ms 5240 KiB
017.txt AC 71 ms 5188 KiB
018.txt AC 89 ms 3472 KiB
019.txt AC 98 ms 4256 KiB
020.txt AC 106 ms 5252 KiB
021.txt AC 78 ms 5196 KiB
022.txt AC 92 ms 3480 KiB
023.txt AC 101 ms 4240 KiB
024.txt AC 107 ms 5268 KiB
025.txt AC 84 ms 5236 KiB
026.txt AC 99 ms 4188 KiB
027.txt AC 106 ms 4660 KiB
028.txt AC 111 ms 5712 KiB
029.txt AC 91 ms 5680 KiB
030.txt AC 139 ms 9892 KiB
031.txt AC 140 ms 9880 KiB
032.txt AC 144 ms 9880 KiB
033.txt AC 128 ms 9884 KiB
example0.txt AC 1 ms 3512 KiB
example1.txt AC 3 ms 7964 KiB
example2.txt AC 1 ms 3668 KiB
hack_001.txt AC 1 ms 3508 KiB
hack_002.txt AC 1 ms 3624 KiB