zoukankan      html  css  js  c++  java
  • HDU4400 离散化+multiset

    题意:引爆一个炸弹会同时引爆与它相距d的炸弹

    重点:由于x,y坐标的范围很大,所以必须离散化,显而易见。在这里可以利用sort+unique进行离散化并存储在myhash中。

    其次由于一个点可能多次放炸弹,但只有一次有效,所以用一个vis数组记录

    所以对于任意一个炸弹(x,y,d)。首先由x-d,x+d在myhash中确定y在set的范围first_pos,last_pos

    然后 再在set中按照y的范围寻找。。。

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<queue>
     5 #include<set>
     6 #include<algorithm>
     7 #include<iostream>
     8 #include<math.h>
     9 using namespace std;
    10 const int maxn = 100015;
    11 int myhash[ maxn ];
    12 struct node{
    13     int x,y,d;
    14 }mine[ maxn ];
    15 struct node2{
    16     int y,id;
    17     node2( int a,int b ){
    18         y=a;
    19         id=b;
    20     }
    21     bool operator<( const node2 &tmp ) const 
    22     {
    23         return y<tmp.y;
    24     }
    25 };
    26 multiset<node2>p[ maxn ];
    27 multiset<node2>::iterator LL,RR,it;
    28 queue<int>q;
    29 bool vis[ maxn ];
    30 void init( int cnt ){
    31     for( int i=0;i<cnt;i++ )
    32         p[ i ].clear();
    33     memset( vis,false,sizeof( vis ));
    34 }
    35 int lisanhua( int n ){
    36     sort( myhash,myhash+n );
    37     int cnt;
    38     cnt=unique( myhash,myhash+n )-myhash;
    39     return cnt;
    40 }//return the new number
    41 int main(){
    42     int n;
    43     int ca=1;
    44     while( scanf("%d",&n)!=EOF,n ){
    45         for( int i=0;i<n;i++ ){
    46             scanf("%d%d%d",&mine[i].x,&mine[i].y,&mine[i].d);
    47             myhash[ i ]=mine[ i ].x;
    48         }
    49         int cnt=lisanhua( n );
    50         init( cnt );
    51         for( int i=0;i<n;i++ ){
    52             int pos=lower_bound( myhash,myhash+cnt,mine[i].x )-myhash;
    53             p[ pos ].insert( node2( mine[i].y,i ));
    54         }
    55         printf("Case #%d:\n",ca++);
    56         int m;
    57         scanf("%d",&m);
    58         while( m-- ){
    59             int id;
    60             scanf("%d",&id);
    61             id--;
    62             if( vis[ id ]==true ){
    63                 puts("0");
    64                 continue;
    65             }
    66             while( !q.empty() )
    67                 q.pop();
    68             int ans=0;
    69             q.push( id );
    70             vis[ id ]=true;
    71             while( !q.empty() ){
    72                 int now_id=q.front();
    73                 q.pop();
    74                 ans++;
    75                 int first_pos=lower_bound( myhash,myhash+cnt,mine[ now_id ].x-mine[ now_id ].d )-myhash;
    76                 int last_pos=upper_bound( myhash,myhash+cnt,mine[ now_id ].x+mine[ now_id ].d )-myhash;
    77                 //首先由横坐标确定大致的 x 寻找范围
    78                 for( int pos=first_pos;pos<last_pos;pos++ ){
    79                     int dy=mine[ now_id ].d-abs( mine[ now_id ].x-myhash[ pos ] );
    80                     LL=p[ pos ].lower_bound( node2( mine[ now_id ].y-dy,0 ) );
    81                     RR=p[ pos ].upper_bound( node2( mine[ now_id ].y+dy,0 ) );
    82                     //然后再由纵坐标确定 y 的寻找范围
    83                     for( it=LL;it!=RR;it++ ){
    84                         if( vis[ it->id ]==false ){
    85                             vis[ it->id ]=true;
    86                             q.push( it->id );
    87                         }
    88                     }
    89                     p[ pos ].erase( LL,RR );//必须删除已经爆炸的点!!!
    90                 }
    91             }
    92             printf("%d\n",ans);
    93         }
    94     }
    95     return 0;
    96 }

    离散化一直是内伤。。。。。

    keep moving...
  • 相关阅读:
    VScode 修改中文字体
    missing KW_END at ')' near '<EOF>'
    SQL inner join, join, left join, right join, full outer join
    SQL字符替换函数translater, replace
    SQL COOKBOOK SQL经典实例代码 笔记第一章代码
    sqlcook sql经典实例 emp dept 创建语句
    dateutil 2.5.0 is the minimum required version python
    安装postgresql后找不到服务 postgresql service
    Postgres psql: 致命错误: 角色 "postgres" 不存在
    【西北师大-2108Java】第十六次作业成绩汇总
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2937860.html
Copyright © 2011-2022 走看看