集训作业 洛谷P3913 车的攻击

这个题一开始被我想复杂了,但总体差不多。

脑子清醒后我直接看他占领了几条长,几条宽,比如一个长3宽3的地图。

被占领了一条宽,就可以看成一个长3宽2的地图。这个长3宽2的地图就是出去可以被攻击的点剩下的格子的数量。

所以就可以写代码了:

#include<iostream>
#include<cstdio>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
long long s[1005];
long long a,b,shu,zshu,shu2;
long long x[1000005],y[1000005];
int main()
{
	scanf("%lld%lld",&a,&b);
	for(int i=0;i<b;i++)
	{
		scanf("%lld%lld",&x[i],&y[i]);
	}
	sort(x,x+b);
	sort(y,y+b);
	for(int i=0;i<b;i++)
	{
		if(x[i]!=x[i-1])//如果有一条新的宽被占领,我就把被占领的宽数+1
		{
			shu++;
		}
		if(y[i]!=y[i-1])//如果有一条新的长被占领,我就把被占领的长数+1
		{
			shu2++;
		}
	}
	printf("%lld",a*a-(a-shu)*(a-shu2));//原来的大小减去不会被攻击到的大小就是会被攻击到的大小啦。
	return 0;
}

总结:或许可以不用仔细的排查重复的攻击点,可以排查重复的攻击排呢。

posted @ 2020-05-08 22:31  lichangjian  阅读(119)  评论(0编辑  收藏  举报