题目链接:
题意:平面上有n个炸弹,给出每个炸弹的中心和爆炸范围d(曼哈顿距离,即|x1-x2|+|y1-y2|)。输出点燃每个炸弹时爆炸的炸弹数。(A炸弹的中心在B炸弹的爆炸范围内,则B炸弹爆炸时,A也会爆炸)
思路:
STL:queue、multiset
函数:unique,lower_bound,upper_bound
首先,将x离散化,就是用unique整一下就行,很厉害。。。然后在去重后的x中查找时用lower_bound,不用自己写二分了,很简单。。。将结构体y和炸弹的编号插在multiset中,multiset真是个好东西。。。然会对于点燃的每个炸弹,BFS,找的时候,先找x的范围,再找y的范围。。
#include#include #include #include #include #include using namespace std;struct Node{ int y,id; Node(){} Node(int _y,int _id):y(_y),id(_id){} bool operator<(const Node a) const { return y S[MAX];multiset ::iterator L,R,it;int hash[MAX],n,m,num=0,visit[MAX],X;Circle a[MAX];int ABS(int x){ if(x<0) return -x; return x;}void deal(){ printf("Case #%d:\n",++num); memset(visit,0,sizeof(visit)); int A,B,i,t,ans,y; queue Q; for(scanf("%d",&m);m--;) { scanf("%d",&t); t--; if(visit[t]) { puts("0"); continue; } while(!Q.empty()) Q.pop(); Q.push(t); visit[t]=1; ans=0; while(!Q.empty()) { ans++; t=Q.front(); Q.pop(); A=lower_bound(hash,hash+X,a[t].x-a[t].d)-hash; B=upper_bound(hash,hash+X,a[t].x+a[t].d)-hash; for(i=A;i id]) { visit[it->id]=1; Q.push(it->id); } } S[i].erase(L,R); } } printf("%d\n",ans); }}int main(){ while(scanf("%d",&n),n) { int i,k; for(i=0;i