题目大意是二维坐标系上有一些炸弹,每个炸弹有x,y坐标和爆炸后波及的范围r,这个r指的是跟自己曼哈顿距离r以内的点
就类似于扫雷那样,一个炸弹爆炸可能引起一片一片的炸弹炸出去
然后有一些询问,问点燃某个炸弹后会有多少个炸弹爆炸 已经炸过的就不算了
应该不难想到是用BFS去找临近的点
我的做法是把横坐标离散化,然后每个横坐标建立一个vector,把相应的y都塞进去
然后每次询问,就bfs, 根据每个炸弹的波及范围,如果炸弹横坐标为x,波及范围为r,那么就去找x-r到x+r坐标的vector
然后在vector里寻找相应范围的y
一个lower_bound和一个upper_bound函数就搞定,然后用erase去除爆炸的点
据说正解应该是KD Tree? 不过我不会那种神奇的数据结构,比赛的时候就试着搞了下STL,没想到直接就过了。也许是数据弱?
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
const int maxn = 110005;
const int inf = 2000000005;
struct NODE{
int y, dis;
NODE(){
}
NODE(int _y, int _dis){
y = _y; dis = _dis;
}
bool operator <(const NODE &tmp)const{
if(y == tmp.y) return dis < tmp.dis;
return y < tmp.y;
}
};
struct POINT{
int x, y, dis;
POINT() {
}
POINT(int _x, int _y, int _dis){
x = _x;
y = _y;
dis = _dis;
}
}df[maxn], myque[1111111];
int n, m, hash[maxn], num;
vector<NODE>mygraph[maxn];
void init(){
num = 0;
for(int i = 0; i < maxn; i++) mygraph[i].clear();
}
void readdata(){
for(int i = 1; i <= n ; i++){
scanf("%d%d%d", &df[i].x, &df[i].y, &df[i].dis);
hash[num++] = df[i].x;
}
sort(hash, hash + num);
num = unique(hash, hash + num) - hash;
for(int i = 1; i <= n; i++){
int id = lower_bound(hash, hash + num, df[i].x) - hash;
mygraph[id].push_back(NODE(df[i].y, df[i].dis));
}
}
int fuckit(int fuckid){
int head = 0, tail = 0, ret = 0;
vector<NODE>::iterator vectoriterator1, vectoriterator2, tmpvectoriterator;
myque[tail++] = POINT(df[fuckid].x, df[fuckid].y, df[fuckid].dis);
while(head < tail){
POINT now = myque[head++];
int pos1 = lower_bound(hash, hash + num, now.x - now.dis) - hash;
int pos2 = upper_bound(hash, hash + num, now.x + now.dis) - hash;
for(; pos1 != pos2; pos1++){
int fucknum = hash[pos1];
int fucky = now.dis - abs(fucknum - now.x);
int id = lower_bound(hash, hash + num, fucknum) - hash;
vectoriterator1 = lower_bound(mygraph[id].begin(), mygraph[id].end(), NODE(now.y - fucky, -1));
vectoriterator2 = upper_bound(mygraph[id].begin(), mygraph[id].end(), NODE(now.y + fucky, inf));
tmpvectoriterator = vectoriterator1;
for(; vectoriterator1 != vectoriterator2; vectoriterator1++){
NODE tmp = *vectoriterator1;
myque[tail++] = POINT(fucknum, tmp.y, tmp.dis);
ret++;
}
mygraph[id].erase(tmpvectoriterator, vectoriterator2);
}
}
return ret;
}
int main(){
int testcases = 0;
while(scanf("%d", &n) != EOF && n){
init();
readdata();
printf("Case #%d:\n", ++testcases);
for(int i = 0; i < num; i++) {
sort(mygraph[i].begin(), mygraph[i].end());
}
scanf("%d", &m);
for(int i = 1; i <= m; i++){
int k;
scanf("%d", &k);
int sum = fuckit(k);;
printf("%d\n", sum);
}
}
return 0;
}