This documentation is automatically generated by online-judge-tools/verification-helper
// verification-helper: PROBLEM https://atcoder.jp/contests/abc259/tasks/abc259_d
#include "src/cpp-template/header/int-alias.hpp"
#include "src/cpp-template/header/rep.hpp"
#include "src/cpp-template/header/size-alias.hpp"
#include "src/data-structure/disjoint-set-union.hpp"
#include "src/geometry/Z2/class/circle.hpp"
#include "src/geometry/Z2/class/point.hpp"
#include "src/geometry/Z2/intersect/is-intersect-circle-circle.hpp"
#include "src/geometry/Z2/intersect/is-intersect-point-circle.hpp"
#include <iostream>
namespace luz {
void main_() {
usize n;
std::cin >> n;
i64 sx, sy, tx, ty;
std::cin >> sx >> sy >> tx >> ty;
using namespace Z2;
Point< i64 > s(sx, sy), t(tx, ty);
Circles< i64 > cs;
for ([[maybe_unused]] usize _: rep(0, n)) {
i64 x, y, r;
std::cin >> x >> y >> r;
cs.emplace_back(Point< i64 >(x, y), r);
}
DisjointSetUnion uf(n + 2);
usize s_idx = n, t_idx = n + 1;
for (usize i: rep(0, n)) {
if (is_intersect_pc(s, cs[i])) {
uf.merge(s_idx, i);
}
if (is_intersect_pc(t, cs[i])) {
uf.merge(i, t_idx);
}
}
for (usize i: rep(0, n))
for (usize j: rep(0, i)) {
if (is_intersect_cc(cs[i], cs[j])) {
uf.merge(i, j);
}
}
std::cout << (uf.same(s_idx, t_idx) ? "Yes" : "No") << std::endl;
}
} // namespace luz
int main() {
luz::main_();
}
#line 1 "test/atcoder/abc259_d.test.cpp"
// verification-helper: PROBLEM https://atcoder.jp/contests/abc259/tasks/abc259_d
#line 2 "src/cpp-template/header/int-alias.hpp"
#include <cstdint>
namespace luz {
using i32 = std::int32_t;
using i64 = std::int64_t;
using i128 = __int128_t;
using u32 = std::uint32_t;
using u64 = std::uint64_t;
using u128 = __uint128_t;
} // namespace luz
#line 2 "src/cpp-template/header/rep.hpp"
#line 2 "src/cpp-template/header/size-alias.hpp"
#include <cstddef>
namespace luz {
using isize = std::ptrdiff_t;
using usize = std::size_t;
} // namespace luz
#line 4 "src/cpp-template/header/rep.hpp"
#include <algorithm>
namespace luz {
struct rep {
struct itr {
usize i;
constexpr itr(const usize i) noexcept: i(i) {}
void operator++() noexcept {
++i;
}
constexpr usize operator*() const noexcept {
return i;
}
constexpr bool operator!=(const itr x) const noexcept {
return i != x.i;
}
};
const itr f, l;
constexpr rep(const usize f, const usize l) noexcept
: f(std::min(f, l)),
l(l) {}
constexpr auto begin() const noexcept {
return f;
}
constexpr auto end() const noexcept {
return l;
}
};
struct rrep {
struct itr {
usize i;
constexpr itr(const usize i) noexcept: i(i) {}
void operator++() noexcept {
--i;
}
constexpr usize operator*() const noexcept {
return i;
}
constexpr bool operator!=(const itr x) const noexcept {
return i != x.i;
}
};
const itr f, l;
constexpr rrep(const usize f, const usize l) noexcept
: f(l - 1),
l(std::min(f, l) - 1) {}
constexpr auto begin() const noexcept {
return f;
}
constexpr auto end() const noexcept {
return l;
}
};
} // namespace luz
#line 2 "src/data-structure/disjoint-set-union.hpp"
#line 5 "src/data-structure/disjoint-set-union.hpp"
#line 7 "src/data-structure/disjoint-set-union.hpp"
#include <cassert>
#include <vector>
namespace luz {
class DisjointSetUnion {
usize n;
// vals[v] :=
// if v is root node: -1 * component size
// otherwise: parent node
std::vector< isize > vals;
void bound_check(usize v) const {
assert(v < n);
}
usize impl_leader(usize v) {
if (vals[v] < 0) return v;
return vals[v] = leader(vals[v]);
}
public:
DisjointSetUnion() = default;
explicit DisjointSetUnion(usize n): n(n), vals(n, -1) {}
usize size() const {
return n;
}
usize leader(usize v) {
bound_check(v);
return impl_leader(v);
}
bool same(usize u, usize v) {
bound_check(u), bound_check(v);
return impl_leader(u) == impl_leader(v);
}
usize merge(usize u, usize v) {
bound_check(u);
bound_check(v);
isize x = impl_leader(u);
isize y = impl_leader(v);
if (x == y) return x;
if (-vals[x] < -vals[y]) std::swap(x, y);
vals[x] += vals[y];
vals[y] = x;
return x;
}
usize group_size(usize v) {
bound_check(v);
return -vals[impl_leader(v)];
}
std::vector< std::vector< usize > > groups() {
std::vector< std::vector< usize > > result(n);
std::vector< usize > leaders(n), g_sizes(n);
for (usize v: rep(0, n)) {
leaders[v] = impl_leader(v);
g_sizes[leaders[v]]++;
}
for (usize v: rep(0, n)) {
result[v].reserve(g_sizes[v]);
}
for (usize v: rep(0, n)) {
result[leaders[v]].emplace_back(v);
}
auto empty_check = [](const std::vector< usize > &vs) {
return vs.empty();
};
result.erase(
std::remove_if(result.begin(), result.end(), empty_check),
result.end());
return result;
}
};
} // namespace luz
#line 2 "src/geometry/Z2/class/circle.hpp"
#line 2 "src/geometry/Z2/class/point.hpp"
#line 2 "src/geometry/Z2/class/vector.hpp"
#line 4 "src/geometry/Z2/class/vector.hpp"
namespace luz::Z2 {
template < typename Z >
class Vector {
Z x_, y_;
public:
Vector(): x_(0), y_(0) {}
Vector(Z x, Z y): x_(x), y_(y) {}
Z x() const {
return x_;
}
Z y() const {
return y_;
}
bool operator==(const Vector &v) const {
return x_ == v.x_ and y_ == v.y_;
}
bool operator!=(const Vector &v) const {
return x_ != v.x_ or y_ != v.y_;
}
Vector &operator+=(const Vector &v) {
x_ += v.x_;
y_ += v.y_;
return *this;
}
Vector &operator-=(const Vector &v) {
x_ -= v.x_;
y_ -= v.y_;
return *this;
}
Vector operator+(const Vector &v) const {
return Vector(*this) += v;
}
Vector operator-(const Vector &v) const {
return Vector(*this) -= v;
}
Vector operator+() const {
return *this;
}
Vector operator-() const {
return Vector() - *this;
}
};
template < typename Z >
using Vectors = std::vector< Vector< Z > >;
} // namespace luz::Z2
#line 4 "src/geometry/Z2/class/point.hpp"
#line 6 "src/geometry/Z2/class/point.hpp"
namespace luz::Z2 {
template < typename Z >
using Point = Vector< Z >;
template < typename Z >
using Points = std::vector< Point< Z > >;
} // namespace luz::Z2
#line 4 "src/geometry/Z2/class/circle.hpp"
#line 6 "src/geometry/Z2/class/circle.hpp"
namespace luz::Z2 {
template < typename Z >
class Circle {
Point< Z > o_;
Z r_;
public:
Circle(): o_(0, 0), r_(0) {}
Circle(Point< Z > o, Z r): o_(o), r_(r) {
assert(r >= 0);
}
Point< Z > center() const {
return o_;
}
Z r() const {
return r_;
}
};
template < typename Z >
using Circles = std::vector< Circle< Z > >;
} // namespace luz::Z2
#line 2 "src/geometry/Z2/intersect/is-intersect-circle-circle.hpp"
#line 2 "src/geometry/Z2/operation/square-norm.hpp"
#line 2 "src/geometry/Z2/operation/square.hpp"
namespace luz::Z2 {
template < typename Z >
Z square(const Z x) {
return x * x;
}
} // namespace luz::Z2
#line 5 "src/geometry/Z2/operation/square-norm.hpp"
namespace luz::Z2 {
template < typename Z >
Z square_norm(Vector< Z > v) {
return square(v.x()) + square(v.y());
}
} // namespace luz::Z2
#line 7 "src/geometry/Z2/intersect/is-intersect-circle-circle.hpp"
#include <utility>
namespace luz::Z2 {
template < typename Z >
bool is_intersect_cc(Circle< Z > c0, Circle< Z > c1) {
if (c0.r() > c1.r()) std::swap(c0, c1);
Z sq_dist = square_norm(c0.center() - c1.center());
if (sq_dist < square(c1.r() - c0.r())) return false;
if (square(c1.r() + c0.r()) < sq_dist) return false;
return true;
}
} // namespace luz::Z2
#line 2 "src/geometry/Z2/intersect/is-intersect-point-circle.hpp"
#line 6 "src/geometry/Z2/intersect/is-intersect-point-circle.hpp"
namespace luz::Z2 {
template < typename Z >
bool is_intersect_pc(Point< Z > p, Circle< Z > c) {
Z sq_norm = square_norm(c.center() - p);
return sq_norm == square(c.r());
}
} // namespace luz::Z2
#line 11 "test/atcoder/abc259_d.test.cpp"
#include <iostream>
namespace luz {
void main_() {
usize n;
std::cin >> n;
i64 sx, sy, tx, ty;
std::cin >> sx >> sy >> tx >> ty;
using namespace Z2;
Point< i64 > s(sx, sy), t(tx, ty);
Circles< i64 > cs;
for ([[maybe_unused]] usize _: rep(0, n)) {
i64 x, y, r;
std::cin >> x >> y >> r;
cs.emplace_back(Point< i64 >(x, y), r);
}
DisjointSetUnion uf(n + 2);
usize s_idx = n, t_idx = n + 1;
for (usize i: rep(0, n)) {
if (is_intersect_pc(s, cs[i])) {
uf.merge(s_idx, i);
}
if (is_intersect_pc(t, cs[i])) {
uf.merge(i, t_idx);
}
}
for (usize i: rep(0, n))
for (usize j: rep(0, i)) {
if (is_intersect_cc(cs[i], cs[j])) {
uf.merge(i, j);
}
}
std::cout << (uf.same(s_idx, t_idx) ? "Yes" : "No") << std::endl;
}
} // namespace luz
int main() {
luz::main_();
}