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;
    }
          
            
    

  • 相关阅读:
    Java线程基础(二)
    Java线程基础(一)
    泛型集合List的详细用法
    Java中日期格式(String、Date、Calendar)的相互转换
    重写Java中包装类的方法
    Java的集合框架(第一次小结)
    node.js 调用mysql 数据库
    win10 系统解决mysql中文乱码问题
    vue-echarts图表
    文件上传的几个例子
  • 原文地址:https://www.cnblogs.com/csnd/p/12063255.html
Copyright © 2011-2022 走看看