给你一些敌人的坐标,每次让你删除某一行或者某一列,问你每一次操作能删除多少人.....
思路:
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; }