这个题一开始被我想复杂了,但总体差不多。
脑子清醒后我直接看他占领了几条长,几条宽,比如一个长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;
}
总结:或许可以不用仔细的排查重复的攻击点,可以排查重复的攻击排呢。