监控覆盖
题目描述
$n*n$ 的网格区域内有 $k$ 个监控摄像,第 $i$ 个监控位于第 $R_i$ 行,第 $C_i$ 列。求至少能被一个监控摄像观察到的格子数量。
监控摄像可以监控同一行或者同一列的地方(监控摄像所在位置也算被监控的区域,两个监控摄像可能会安装在同一位置)
输入格式
第 $1$ 行,$2$ 个整数$n,k$。
接下来 $k$ 行,每行 $2$ 个整数 $R_i,C_i$。
输出格式
1 个整数,表示被监控的格子数量。
样例 #1
样例输入 #1
3 2
1 2
2 2
样例输出 #1
7
提示
• 对于30% 的数据,$1 \le N \le 10^3; 1 \le K \le 10^3$;
• 对于60% 的数据,$1 \le N \le 10^6; 1 \le K \le 10^6$;
• 对于100% 的数据,$1 \le N \le 10^9; 1 \le K \le 10^6; 1 \le R_i , C_i \le N$。
#include <bits/stdc++.h>
using namespace std;
int x[1011000],y[1011000];
int main()
{
long long k,n,s=0,h=0,t=0;
scanf("%lld%lld",&n,&k);
for(int i=1;i<=k;i++)
{
scanf("%lld%lld",&x[i],&y[i]);
}
sort(x+1,x+k+1);
sort(y+1,y+k+1);
for(int i=1;i<=k;i++)
{
if(x[i]!=x[i+1])
{
s++;
}
}
for(int i=1;i<=k;i++)
{
if(y[i]!=y[i+1])
{
t++;
}
}
h=s*n+(n-s)*t;
cout<<h<<endl;
return 0;
}