数组去重函数(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;

}
posted @ 2022-10-10 21:22  Luli&  阅读(402)  评论(0编辑  收藏  举报