76 lines
1.9 KiB
C++
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;
|
|
} |