HDU 4022 Bombing

STL题,将map与multiset相结合

题目链接HDU 4022

题目大意

有一个地图,在某些点上有敌方基地,你可以一次炸毁某一行或某一列,输出每次炸毁的基地数目。

题解

两个map,分别存行与列。将每一行或列的存在基地的坐标都存入set中,将这个set与本行或列的标号相映射,炸毁某一行时将这个set删除,注意删除前要将set中的每个元素从另一个
map中删除。代码如下:

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <bitset>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
typedef map<int , multiset <int> > mp;
mp x, y;//分别存行与列的基地坐标
int getans(mp &x, mp &y, int pos)//炸毁
{
int ans = x[pos].size();
for (multiset<int> ::iterator i = x[pos].begin(); i != x[pos].end(); ++i)
{
y[*i].erase(pos);
}
x[pos].clear();
return ans;
}
int main ()
{
int n, m;
while (scanf("%d%d", &n, &m),n||m)
{
x.clear();
y.clear();
for (int i = 0; i < n; ++i)
{
int xx, yy;
scanf("%d%d", &xx, &yy);
x[xx].insert(yy);
y[yy].insert(xx);
}
for (int i = 0; i < m; ++i)
{
int cmd, pos;
scanf("%d%d", &cmd, &pos);
if (cmd == 0)
{
printf("%d\n", getans(x, y, pos));
}
else
{
printf("%d\n", getans(y, x, pos));
}
}
printf("\n");
}
}
坚持原创技术分享,您的支持将鼓励我继续创作!