(x, y, r) 存一颗雷或者火箭信息, 读入一个火箭,先找(x-r, x+r), (y-r, y+r)方形区域内的雷。再确定哪些落在圆内。圆内的雷按同样的方式先方形再圆形找被引爆的雷,直到没有雷可以引爆。
数据较大,5*10^4, 需要优化到O(nlogn)左右。可以给横坐标x,纵坐标y排序,查找时用二分查找。并且 0 <= x, y <= 10^9, 下标要做压缩。
map, 按mp[x][y][r]:(x, y) 点爆炸半径为 r 有几颗雷。
res 存结果,可以引爆几颗q中。xiter = mp.lower_bound(x - r), 二分查找 第一个不小于 x-r 的横坐标xed = mp.upper_bound(x + r), 二分查找 第一个大于 x+r 的横坐标[xiter->first, xed->first)yiter = xiter->second.lower_bound(y - r)yed = xiter->second.upper_bound(y + r)xiter->second 也就是 mp[x][yiter->first, yed->first)(xiter->first, yiter->first)是否在引爆范围,如果在:
yiter->second也就是mp[x][y], 得到key为半径r, value为炸弹个数的unordered_mapfor(const auto& bm:yiter->second) res += bm->second也就是当前雷的个数,yiter = xiter->second.erase(yiter)。xiter = mp.erase(xiter);#include
using namespace std;
const int fff = []() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); return 0; }();
bool is_in_scope(long long x1, long long y1, long long r, long long x2, long long y2) {
return (x1 - x2) * (x1 - x2) <= r * r - (y1 - y2) * (y1 - y2);
}
int main() {
int n, m;
cin >> n >> m;
map<int, map<int, unordered_map<int, int>>> mp;
for (int i = 0; i < n; i++) {
int x, y, r;
cin >> x >> y >> r;
mp[x][y][r]++;