
这是一场残酷的战争,数百万人的人失去生命、流离失所,摧毁了一连串的城市。为了阻止外星人的入侵,让我们轰炸它们的基地。
在现有的科技水平下,这似乎不是一件困难的事情,然而,你将遇到一个更困难的问题:计算军队的战功。在轰炸行动中,指挥官会派出一艘艘具有巨大破坏力的星际战舰,将一条线上的目标尽数摧毁。由于我们间谍的出色工作,敌方所有基地的位置都已被发现并标注在地图上,之后,我们将向您发送轰炸计划。
具体来说,地图被表示为一个2维平面,上面标记了一些敌人基地的位置。星际战舰被有序地派出,每一艘都将轰炸地图上的一条垂直或水平的线。然后你的命令要你报告多少基地将被摧毁的每一艘星际战舰。注意,当计算后来的星际战舰的攻击时,一个被摧毁的基地将不会被考虑进去。
题目
- 原题地址:星球大战
- 题目编号:NC235267
- 题目类型:map、list
- 时间限制:C/C++ 2秒,其他语言4秒
- 空间限制:C/C++ 262144K,其他语言524288K
1.题目大意
- 二维平面上
n
个坐标对应着敌人,m
次操作,每次操作消除指定的一行或一列的敌人,问每次操作消灭的敌人的个数
2.题目分析
- 使用
map
存储每个出现的x
坐标对应的所有y
坐标,以及每个出现的y
坐标对应的所有x
坐标
- 消灭的敌个数就是
list
的大小,例如消灭x=d
直线上的所有敌人,消灭的敌人数就是x
对应的存储y
坐标的list
的大小
- 随后遍历该
x
对应的所有y
的list
,从中移除该x
,最后再将该x
的list
清空
3.题目代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
map<int, list<int>> xx, yy;
int x, y;
for(int i=0;i<n;i++) {
cin >> x >> y;
xx[x].push_back(y);
yy[y].push_back(x);
}
int c, d;
while(m--) {
cin >> c >> d;
if(!c) {
cout << xx[d].size() << endl;
for(auto k: xx[d]) yy[k].remove(d);
xx[d].clear();
} else {
cout << yy[d].size() << endl;
for(auto k: yy[d]) xx[k].remove(d);
yy[d].clear();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效