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