結果

問題 No.1605 Matrix Shape
ユーザー KoD
提出日時 2021-07-16 21:39:47
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 66 ms / 2,000 ms
コード長 3,284 bytes
コンパイル時間 1,853 ms
コンパイル使用メモリ 204,992 KB
最終ジャッジ日時 2025-01-23 01:31:56
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 34
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <bits/stdc++.h>
using i32 = std::int32_t;
using u32 = std::uint32_t;
using i64 = std::int64_t;
using u64 = std::uint64_t;
using i128 = __int128_t;
using u128 = __uint128_t;
using isize = std::ptrdiff_t;
using usize = std::size_t;
class rep {
struct Iter {
usize itr;
constexpr Iter(const usize pos) noexcept : itr(pos) {}
constexpr void operator++() noexcept { ++itr; }
constexpr bool operator!=(const Iter& other) const noexcept { return itr != other.itr; }
constexpr usize operator*() const noexcept { return itr; }
};
const Iter first, last;
public:
explicit constexpr rep(const usize first, const usize last) noexcept : first(first), last(std::max(first, last)) {}
constexpr Iter begin() const noexcept { return first; }
constexpr Iter end() const noexcept { return last; }
};
class UnionFind {
usize components;
std::vector<usize> data;
public:
explicit UnionFind(const usize size = 0) : components(size), data(size, (usize)-1) {}
usize size() const { return data.size(); }
usize count() const { return components; }
usize leader(const usize u) {
assert(u < size());
if (data[u] >= size()) return u;
return data[u] = leader(data[u]);
}
usize size(const usize u) {
assert(u < size());
return -data[leader(u)];
}
std::pair<usize, bool> merge(usize u, usize v) {
assert(u < size());
assert(v < size());
u = leader(u);
v = leader(v);
if (u == v) return std::make_pair(u, false);
if (data[u] > data[v]) std::swap(u, v);
components -= 1;
data[u] += data[v];
data[v] = u;
return std::make_pair(u, true);
}
bool same(const usize u, const usize v) {
assert(u < size());
assert(v < size());
return leader(u) == leader(v);
}
std::vector<std::vector<usize>> decompose() {
std::vector<std::vector<usize>> ret(size());
for (const usize u : rep(0, size())) {
ret[leader(u)].push_back(u);
}
ret.erase(std::remove_if(ret.begin(), ret.end(), [&](const std::vector<usize>& v) { return v.empty(); }),
ret.end());
return ret;
}
};
template <class T> using Vec = std::vector<T>;
void main_() {
usize N;
std::cin >> N;
constexpr usize V = 200001;
Vec<usize> in(V), out(V);
UnionFind dsu(V);
for (const auto i : rep(0, N)) {
usize h, w;
std::cin >> h >> w;
in[w] += 1;
out[h] += 1;
dsu.merge(h, w);
}
usize start = 0, alive = 0;
std::set<usize> comps;
for (const auto i : rep(0, V)) {
if (in[i] < out[i]) {
if (in[i] + 1 == out[i]) {
start += 1;
} else {
std::cout << "0\n";
return;
}
}
if (in[i] + out[i] > 0) {
alive += 1;
comps.insert(dsu.leader(i));
}
}
if (start > 1 or comps.size() > 1) {
std::cout << "0\n";
return;
}
std::cout << (start == 1 ? 1 : alive) << '\n';
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
main_();
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0