题目
N×N的国际象棋棋盘上有K个车,第i个车位于第Ri行,第Ci 列。求至少被一个车攻击的格子数量。
车可以攻击所有同一行或者同一列的地方。
输入输出格式
输入格式
第1行,2个整数N,K。
接下来K行,每行2个整数Ri,Ci。
输出格式
1个整数,表示被攻击的格子数量。
输入输出样例
输入样例
3 2
1 2
2 2
输出样例
7
解析
这个题目交叉点的个数就是有车的行数*有车的列数,那么就不难导出公式:
ans=sizex∗n+sizey∗n−sizey∗sizex
然后就是统计一共有几行几列有车了,这里就要用到stl中的unique,也就是去重
unique(数组名,数组名+大小)
需要注意的有两点:
第一点:在unique之前必须保证去重数组有序,也就是得sort一下。
第二点:unique并不会生成一个新的数组,而是将原数组多余的部分“移”到了数组之后,同时unique本身还会返回一个指针,指向去重之后的最后一位。
利用c++可以指针相加减的特点,我们可以通过unique-数组指针来知道去重之后数组的“大小”。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
long long n,k,x[maxn],y[maxn];
int main(){
scanf("%lld%lld",&n,&k);
for(long long i=0;i<k;i++){
scanf("%lld%lld",&x[i],&y[i]);
}
sort(x,x+k);
sort(y,y+k);
long long sizex=unique(x,x+k)-x;
long long sizey=unique(y,y+k)-y;
printf("%lld",sizex*n+sizey*n-sizex*sizey);
return 0;
}