hdu 4022 Bombing

1002 Bombing  The 36th ACM/ICPC Asia Regional Shanghai Site —— Online Contest

本题的思路就是将点映射一下,一次加入map,坐标值变成映射值,这样在利用静态链表进行处理,因为有可能横着炸或者竖着炸,所以结构体里加了一个标记is,防止重复统计,下面的应该很好理解了。

#include <iostream>
#include <string.h>
#include <map>
#include <stdio.h>
using namespace std;
map<int,int> mappp1,mappp2;
int n1,n2,k,k1;
int get1(int x){
    if (mappp1.find(x)==mappp1.end()){
        mappp1.insert(make_pair(x,n1));
        n1++;
        return n1-1;
    }else return mappp1[x];
}
int get2(int x){
    if (mappp2.find(x)==mappp2.end()){
        mappp2.insert(make_pair(x,n2));
        n2++;
        return n2-1;
    }else return mappp2[x];
}
int eHd[100005],eHd1[100005];
struct{
    int v,next;
    bool is;
}edge[100005],edge1[100005];
void add_edge(int u,int v){
    edge[k].v=v;
    edge[k].is=1;
    edge[k].next=eHd[u];
    eHd[u]=k++;
    edge1[k1].v=u;
    edge1[k1].is=1;
    edge1[k1].next=eHd1[v];
    eHd1[v]=k1++;
}
void init(){
    memset(eHd1,-1,sizeof(eHd1));
    memset(eHd,-1,sizeof(eHd));
    k=0;
    k1=0;
    n1=0;
    n2=0;
    mappp1.clear();
    mappp2.clear();
}
int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF&&n+m){
        init();
        for(int i=0;i<n;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            add_edge(get1(x),get2(y));
        }
        int a,b,out;
        for(int mm=0;mm<m;mm++){
            out=0;
            scanf("%d%d",&a,&b);
            if(a==0){
                for(int i=eHd[get1(b)];i!=-1;i=edge[i].next){
                    if(edge[i].is){
                        out++;
                        edge[i].is=0;
                        edge1[i].is=0;
                    }
                }
            }

            else{
                for(int i=eHd1[get2(b)];i!=-1;i=edge1[i].next){
                    if(edge1[i].is){
                        out++;
                        edge[i].is=0;
                        edge1[i].is=0;
                    }
                }
            }
            printf("%d\n",out);
        }
        printf("\n");
    }
    return 0;
}


  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值