hdu4022 map+multiset

题意:
      给你一些敌人的坐标,每次让你删除某一行或者某一列,问你每一次操作能删除多少人.....

思路:

      map和multiset的完美结合,吧set定义到map里,达到一个一对多的效果,其实就是实现一个一维multi数组,可以随时查询长度的数组,同时用map还可以达到离散化的效果,开两个数组,表示 markx[] ,marky[], x所在行 和 y所在列的元素,这样每次 清除一行 和 另一个数组中的某些元素,或者清除一列和另一个数组中的某些元素,达到越删除越快的效果,时间复杂度最大是 O(n)....... 


#include<stdio.h>
#include<map>
#include<set>

using namespace std;

map<int ,multiset<int> >markx ,marky;
multiset<int>::iterator iter;

int main ()
{
   int n ,m ,i ,a ,b;
   while(~scanf("%d %d" ,&n ,&m) &&  n + m)
   {
      markx.clear();
      marky.clear();
      for(i = 1 ;i <= n ;i ++)
      {
         scanf("%d %d" ,&a ,&b);
         markx[a].insert(b);
         marky[b].insert(a);
      }
      for(i = 1 ;i <= m ;i ++)
      {
         scanf("%d %d" ,&a ,&b);
         int ans;
         if(!a)
         {
            ans = markx[b].size();
            for(iter = markx[b].begin() ;iter != markx[b].end() ;iter ++)
            {
               marky[*iter].erase(b);
            }
            markx[b].clear();
         }
         else
         {
            ans = marky[b].size();
            for(iter = marky[b].begin() ;iter != marky[b].end() ;iter ++)
            {
               markx[*iter].erase(b);
            }
            marky[b].clear();
         }
         printf("%d
" ,ans);
      }
      printf("
");
   }
   return 0;
}
      
        

原文地址:https://www.cnblogs.com/csnd/p/12063255.html