列表

详情


NC235267. 星球大战

描述

这是一场残酷的战争,数百万人的人失去生命、流离失所,摧毁了一连串的城市。为了阻止外星人的入侵,让我们轰炸它们的基地。
在现有的科技水平下,这似乎不是一件困难的事情,然而,你将遇到一个更困难的问题:计算军队的战功。在轰炸行动中,指挥官会派出一艘艘具有巨大破坏力的星际战舰,将一条线上的目标尽数摧毁。由于我们间谍的出色工作,敌方所有基地的位置都已被发现并标注在地图上,之后,我们将向您发送轰炸计划。
具体来说,地图被表示为一个2维平面,上面标记了一些敌人基地的位置。星际战舰被有序地派出,每一艘都将轰炸地图上的一条垂直或水平的线。然后你的命令要你报告多少基地将被摧毁的每一艘星际战舰。注意,当计算后来的星际战舰的攻击时,一个被摧毁的基地将不会被考虑进去。

输入描述

第一行输入两个整数,分别表示外星人基地的数量和派出的星际战舰的数量。
接下来的N行,每行两个整数表示外星人基地的坐标。
接下来的M行,每行两个整数表示星际战舰的状态,表示星际战舰将摧毁直线上的所有外星人基地,则是直线

输出描述

输出M行,每行一个整数表示这次攻击中被摧毁的外星人基地数量。

示例1

输入:

3 2
1 2
1 3
2 3
0 1
1 3

输出:

2
1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 593ms, 内存消耗: 13516K, 提交时间: 2022-08-21 12:01:19

#include<bits/stdc++.h>
using namespace std;
map<int,int>mx,my;
const int N=1e5+5;
int x[N],y[N];
int ans[N];
int main()
{
	int m,n;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>x[i]>>y[i];
	}
	int a,b;
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b;
		if(a==0)
		{
			if(mx[b]==0) 
				mx[b]=i;// key=b value=i
		}
		else
		{
			if(my[b]==0) my[b]=i;
		}
	}
	for(int i=1;i<=n;i++)
	{
		int nx=mx[x[i]],ny=my[y[i]];
		if(nx==0||ny==0)
		{
			if(nx!=0) ans[mx[x[i]]]++;
			else if(ny!=0) ans[my[y[i]]]++;
		}
		else
		{
			if(mx[x[i]]<my[y[i]]) ans[mx[x[i]]]++;
			else ans[my[y[i]]]++;
		}
	}
	for(int i=1;i<=m;i++)
		cout<<ans[i]<<endl;
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 1101ms, 内存消耗: 29692K, 提交时间: 2023-01-12 21:43:26

#include<bits/stdc++.h>
using namespace std;
map<int ,list<int>>x_y,y_x;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,m;cin>>n>>m;
	int x,y;
	for(int i=0;i<n;i++){
		cin>>x>>y;
		x_y[x].push_back(y);
		y_x[y].push_back(x);   
	}
	int c,d;
	while(m--){
		cin>>c>>d;
		if(c==0){
			cout<<x_y[d].size()<<endl;
			for(auto s:x_y[d])
			{
				y_x[s].remove(d);
			}
			x_y[d].clear();
		}
		else{
			cout<<y_x[d].size()<<endl;
			for(auto s:y_x[d])
			{
				x_y[s].remove(d);
			}
			y_x[d].clear();
		}
	}
	return 0;
}

上一题