HDU 4022 Bombing【STL 继续练习】

HDU 4022 Bombing【STL 继续练习】

今天真是各种sb,弱爆了。
果然以后做网预的时候就应该第一道水题用STL各种水。
闲话少说。
本题题意略,直接说做法。
首先,必需的是离散化。sort+MAP是我的离散化方法,个人觉得这样虽然慢,但是好写。
后面的就八仙过海各显神通了。什么用十字链表模拟啊,什么multiset啊,什么vector啊,什么数组直接标记啊,不一而足,水题就要用水题的方法做。
我是vector做的。
开了200000个vector分别用来存储离散化后的每行及每列中元素的个数。
每次查询的时候,将对应行/或者列的size输出,然后对其中每个元素在另外一边(行/列)用upper/lower_bound查存在性,存在的都删除erase,然后将本行/列清空clear。
一开始就是WA在此处了,因为有重复坐标的点,而set的一般写法无法处理这种情况,想了半天最后用了vector+二分。太蛋疼了。
还RE了一次,因为对于vector来说,erase作为动态删除会使其周围元素的指针改变,会发生内存泄漏、指针悬挂等现象,所以果断要用erase的范围删除操作[low,up)。
没啥说的,复杂度均摊下来很小,因为不会重复统计,所以顶多是NlogN的复杂度,再加上离散化的复杂度,整体NlogN。

老话,STL能做,为啥要手写?出题卡STL的就是sb,不解释;至于什么叫卡STL,各位大牛都懂得。
今天弱爆了,就这样吧。
附代码:
#include  < iostream >
#include 
< cstdio >
#include 
< set >
#include 
< map >
#include 
< vector >
#include 
< cmath >
#include 
< algorithm >
using   namespace  std;
#define  maxn 100005
struct  point
{
    
int  x,y;
    point(){}
    point(
int  a, int  b):x(a),y(b){}
}p[maxn];
int  x[maxn],y[maxn];
int  n,m;
vector 
< int >  X[maxn],Y[maxn];
map 
< int , int >  MX,MY;
vector 
< int >  ::iterator xlow,xup,ylow,yup,idx,idy;
int  main()
{
    
while (scanf( " %d %d " , & n, & m)  ==   2   &&  (n  ||  m))
    {
        MX.clear();
        MY.clear();
        
for ( int  i  =   1 ;i  <=  n;i ++ )
        {
            
if ( ! X[i].empty())
                X[i].clear();
            
if ( ! Y[i].empty())
                Y[i].clear();
        }
        
for ( int  i  =   0 ;i  <  n;i ++ )
        {
            
int  a,b;
            scanf(
" %d %d " , & a, & b);
            p[i] 
=  point(a,b);
            x[i] 
=  a;
            y[i] 
=  b;
        }
        sort(x,x 
+  n);
        sort(y,y 
+  n);
        
int  cntx  =   1 ,cnty  =   1 ;
        
for ( int  i  =   0 ;i  <  n;i ++ )
        {
            
if (MX[x[i]]  ==   0 )
                MX[x[i]] 
=  cntx ++ ;
            
if (MY[y[i]]  ==   0 )
                MY[y[i]] 
=  cnty ++ ;
        }
        
for ( int  i  =   0 ;i  <  n;i ++ )
        {
            p[i].x 
=  MX[p[i].x];
            p[i].y 
=  MY[p[i].y];
            idx 
=  lower_bound(X[p[i].x].begin(),X[p[i].x].end(),p[i].y);
            X[p[i].x].insert(idx,p[i].y);
            idy 
=  lower_bound(Y[p[i].y].begin(),Y[p[i].y].end(),p[i].x);
            Y[p[i].y].insert(idy,p[i].x);
        }
        
for ( int  i  =   0 ;i  <  m;i ++ )
        {
            
int  mod,d;
            scanf(
" %d %d " , & mod, & d);
            
if (mod  ==   0 )
            {
                d 
=  MX[d];
                printf(
" %d\n " ,X[d].size());
                
if (X[d].empty())
                    
continue ;
                
for (idx  =  X[d].begin();idx  !=  X[d].end();idx ++ )
                {
                    
int  p  =   * idx;
                    ylow 
=  lower_bound(Y[p].begin(),Y[p].end(),d);
                    yup 
=  upper_bound(Y[p].begin(),Y[p].end(),d);
                    Y[p].erase(ylow,yup);
                }
                X[d].clear();
            }
            
else
            {
                d 
=  MY[d];
                printf(
" %d\n " ,Y[d].size());
                
if (Y[d].empty())
                    
continue ;
                
for (idy  =  Y[d].begin();idy  !=  Y[d].end();idy ++ )
                {
                    
int  p  =   * idy;
                    xlow 
=  lower_bound(X[p].begin(),X[p].end(),d);
                    xup 
=  upper_bound(X[p].begin(),X[p].end(),d);
                    X[p].erase(xlow,xup);
                }
                Y[d].clear();
            }
        }
        puts(
"" );
    }
}

你可能感兴趣的:(HDU 4022 Bombing【STL 继续练习】)