Hdu 4400

来源:互联网 发布:淘宝运营开店须知 编辑:程序博客网 时间:2024/05/16 11:14

题意: 题意就是给出N个炸弹,一个炸弹爆炸后会引爆周围一定范围的炸弹,每次询问一个炸弹,求这次爆炸的炸弹数量。另外,对于已经爆炸了的炸弹,直接输出0就行了。

解法:很容易想到对每个炸弹标记一下,对于每次询问bfs就可以了。使用STL就很方便了。


#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <set>
using namespace std;
const int M=100010;
int n;
struct Node
{
    int y,id;
    Node(){}
    Node(int a,int b):y(a),id(b){}
    bool operator<(const Node &tmp)const
    {
        return y<tmp.y;
    }
};
struct node
{
    int x,y,r;
} p[M];
multiset<Node >  P[M];
multiset<Node >::iterator ll,rr,it;
bool use[M];
queue<int >  q;
int hash[M];


int main()
{
    int cas=0,m,id;
    int X,j;
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].r);
            hash[i]=p[i].x;
        }
        sort(hash,hash+n);
        X=unique(hash,hash+n)-hash;
        memset(use,0,sizeof(use));
        for(int i=0;i<X;i++)
        P[i].clear();
        for(int i=0;i<n;i++)
        {
           j=lower_bound(hash,hash+X,p[i].x)-hash;
           P[j].insert(Node(p[i].y,i));
        }
        scanf("%d",&m);
        printf("Case #%d:\n",++cas);
        while(m--)
        {
            scanf("%d",&id);
            id--;
            if(use[id])
            {
                puts("0");
                continue;
            }
            use[id]=1;
            int cnt=0;
            q.push(id);
            while(!q.empty())
            {
                cnt++;
                id=q.front();
                q.pop();
                int l=lower_bound(hash,hash+X,p[id].x-p[id].r)-hash;
                int r=upper_bound(hash,hash+X,p[id].x+p[id].r)-hash;
                for(int i=l;i<r;i++)
                {
                    int dy=p[id].r-abs(p[id].x-hash[i]);
                    ll=P[i].lower_bound(Node(p[id].y-dy,0));
                    rr=P[i].upper_bound(Node(p[id].y+dy,0));
                    for(it=ll;it!=rr;++it)
                    {
                        if(!use[it->id])
                        {
                              use[it->id]=1;
                              q.push(it->id);
                        }
                    }
                    P[i].erase(ll,rr);
                }
            }
            printf("%d\n",cnt);
        }
    }
    return 0;
}


原创粉丝点击