数组去重函数(unique)
题目链接
stl中的一员大将:unique
也就是去重,通俗来讲,这个玩应的用法一般是
unique(数组名,数组名+大小)
(没错和sort几乎一模一样)
然后值得注意的有两点:
第一点:在unique之前必须保证去重数组有序,也就是得一下。
第二点:unique并不会生成一个新的数组,而是将原数组多余的部分“移”到了数组之后,同时unique本身还会返回一个指针,指向去重之后的最后一位。
利用c++可以指针相加减的特点,我们可以通过 unique-数组指针 来知道去重之后数组的“大小”。
ll x = unique(a, a + k) - a;
ll y = unique(b, b + k) - b;
题目解读
由于N为10^9,所以用数组就不可以了(内存会爆)。我们可以找出所有的横坐标与纵坐标的总数:
不难看出,交叉点的个数就是有车的行数*有车的列数,那么就不难导出公式:
ans=sizex*n+sizey*n-sizey*sizex
那么我们的AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int a[N], b[N];
int n, k;
int main() {
cin >> n >> k;
for (int i = 0; i < k; i++) cin >> a[i] >> b[i];
sort(a, a + k);
sort(b, b + k);
ll x = unique(a, a + k) - a;
ll y = unique(b, b + k) - b;
ll ans = n * (x + y) - x * y;
cout << ans;
return 0;
}
没有什么能阻止我对知识的追求!!!