Files
SH-Quizzes/ACMOJ-1072.cpp
2023-12-24 22:34:36 +08:00

76 lines
1.9 KiB
C++

#include <iomanip>
#include <iostream>
using namespace std;
class CircleSet {
friend istream &operator>>(istream &in, CircleSet &obj);
private:
struct Circle {
long long x, y, r;
Circle(long long _x = 0, long long _y = 0, long long _r = 0)
: x(_x), y(_y), r(_r) {}
};
int count; // 集合中圆的数目
Circle *circles; // 集合中所有圆
public:
CircleSet(int n) : count(n) {
circles = new Circle[n];
count = n;
}
~CircleSet() { delete[] circles; }
int operator[](int idx) const noexcept { return circles[idx].r; }
bool checkContaining(int p, int q) {
if (circles[p].r <= circles[q].r) return false;
return (circles[p].x - circles[q].x) * (circles[p].x - circles[q].x) +
(circles[p].y - circles[q].y) * (circles[p].y - circles[q].y) <
(circles[p].r - circles[q].r) * (circles[p].r - circles[q].r);
}
int getCircleContainingQ(int q) {
int res = -1;
for (int p = 0; p < count; p++) {
if (!checkContaining(p, q)) continue;
if (res == -1)
res = circles[p].r;
else
res = (circles[p].r < res) ? circles[p].r : res;
}
return res;
}
};
istream &operator>>(istream &in, CircleSet &obj) {
for (int i = 0; i < obj.count; ++i) {
in >> obj.circles[i].x >> obj.circles[i].y >> obj.circles[i].r;
}
return in;
}
int main() {
#ifdef local
freopen("pro.in", "r", stdin);
#endif
int n, m, type;
cin >> n >> m;
CircleSet set(n);
cin >> set; // 输入集合中的所有圆
while (m--) {
int type, p, q;
cin >> type;
if (type == 1) {
// do nothing
} else if (type == 2) {
for (int i = 0; i < n; ++i) {
cout << set[i] << ' ';
}
cout << endl;
} else if (type == 3) {
cin >> p >> q;
cout << set.checkContaining(p, q) << endl;
} else if (type == 4) {
cin >> q;
cout << set.getCircleContainingQ(q) << endl;
}
}
return 0;
}