union 去重
Bug
unique是algorithm中的一个函数,可以对数组进行去重(离散化的时候会用到)。如下:
| int newN = unique(num + 1, num + 1 + n) - num - 1;
|
但是后面的“-num-1”经常容易丢掉“-1”。unique函数返回的是去重完毕的数组尾地址的后一个。所以有如下标准写法:
| int newN = unique(Begin, End) - Begin;
|
因为我们知道“数组尾地址的后一个”减去数组首地址就是数组的长度。将num+1代入Begin,就可得到正确写法。
注意区分
函数lower_bound返回的也是数组地址(迭代器)。但是由于lower_bound函数返回的地址不是目标地址的下一个,因此不需要“-1”,直接减去数组名即可。
错题
- 离散化去重时,unique地址应减“数组地址 + 1”而不是 “数组地址”
- 因为union函数返回的是数组尾地址的后一个
| int main(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
num[i] = a[i];
}
sort(num + 1, num + 1 + n);
// 这里
int newN = unique(num + 1, num + 1 + n) - num - 1;
for(int i = 1; i <= newN; i++){
mp[num[i]] = i;
}
newN += 5;
long long ans = 0;
for(int i = 1; i <= n; i++){
ans += query(1, 1, newN, mp[a[i]] + 1, newN);
update(1, 1, newN, mp[a[i]], 1);
}
cout << ans << endl;
return 0;
}
|