zoukankan      html  css  js  c++  java
  • 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;
    }
          
            
    

  • 相关阅读:
    笔试面试题集锦
    Mosquitto pub/sub服务实现代码浅析-主体框架
    查找算法(一)
    基数排序
    插入排序-----希尔排序
    插入排序------直接插入排序
    归并排序
    选择排序--------简单选择排序
    交换排序------冒泡排序
    排序算法
  • 原文地址:https://www.cnblogs.com/csnd/p/12063254.html
Copyright © 2011-2022 走看看