HDU 4400 Mines(STL)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4400

题意:平面上有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 <iostream>

#include <cstdio>

#include <cstring>

#include <set>

#include <queue>

#include <algorithm>

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<a.y;

    }

};



struct Circle

{

    int x,y,d;

};



const int MAX=100005;

multiset<Node> S[MAX];

multiset<Node>::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<int> 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<B;i++)

            {

                y=a[t].d-ABS(a[t].x-hash[i]);

                L=S[i].lower_bound(Node(a[t].y-y,0));

                R=S[i].upper_bound(Node(a[t].y+y,0));

                for(it=L;it!=R;it++)

                {

                    if(!visit[it->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<n;i++)

        {

            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].d);

            hash[i]=a[i].x;

        }

        sort(hash,hash+n);

        X=unique(hash,hash+n)-hash;

        for(i=0;i<n;i++) S[i].clear();

        for(i=0;i<n;i++)

        {

            k=lower_bound(hash,hash+X,a[i].x)-hash;

            S[k].insert(Node(a[i].y,i));

        }

        deal();

    }

    return 0;

}

 


 

 

你可能感兴趣的:(HDU)