题目描述
N \times NN×N 的国际象棋棋盘上有KK 个车,第ii个车位于第R_iRi行,第C_iCi 列。求至少被一个车攻击的格子数量。
车可以攻击所有同一行或者同一列的地方。
输入格式
第1 行,2 个整数N,KN,K。
接下来K 行,每行2 个整数R_i,C_iRi,Ci。
输出格式
1 个整数,表示被攻击的格子数量。
输入输出样例
输入 #1复制
3 2 1 2 2 2
输出 #1复制
7
说明/提示
• 对于30% 的数据,1 \le N \le 10^3; 1 \le K \le 10^31≤N≤103;1≤K≤103;
• 对于60% 的数据,1 \le N \le 10^6; 1 \le K \le 10^61≤N≤106;1≤K≤106;
• 对于100% 的数据,1 \le N \le 10^9; 1 \le K \le 10^6; 1 \le R_i , C_i \le N1≤N≤109;1≤K≤106;1≤Ri,Ci≤N。
这道目显然不能开set 直接会爆精度 也不能开到1e9的数组,看到这种情况直接排序开unique
#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = a; i <= b; i ++)
#define per(i, a, b) for(int i = a; i >= b; i --)
//#define int long long
using namespace std;
typedef long long ll;
const int maxn = 1e6+ 5;
int a[maxn];
int b[maxn];
signed main(){
ll n;
cin>>n;
int k;
cin>>k;
rep(i,1,k)
{
cin>>a[i]>>b[i];
}
sort(a+1,a+1+k);
sort(b+1,b+1+k);
// cout<<sumx<<" "<<sumy<<endl;
ll sum1 = unique(a+1,a+1+k)-a -1;
ll sum2 = unique(b+1,b+1+k)-b-1;
cout<<(sum1+sum2)*n-sum1*sum2;
return 0;
}