leetcode3072 将元素分配到两个数组中2
给定数组nums[n],定义f(arr,val)表示数组arr中大于val的元素个数,需要操作n次将nums分配到两个数组里,具体如下:
- 第1次操作将nums[1]追加到arr1,第2次操作将nums[2]追加到arr2
- 后续第i次操作:
- 如果f(arr1,nums[i]) > f(arr2,nums[i]),则将nums[i]追加到arr1。
- 如果f(arr1,nums[i]) < f(arr2,nums[i]),则将nums[i]追加到arr2。
- 如果相等,则将nums[i]追加到元素少的数组中,如果个数也相等,则追加到arr1。
最后连接arr1和arr2返回。(范围:3<=n<=1E5)
分析:一般做法是离散化+树状数组,这里直接套平衡树模板。
using i64 = long long;
// Treap模板...
class Solution {
public:
vector<int> resultArray(vector<int>& nums) {
int n = nums.size();
vector<int> z1(n), z2(n);
int n1 = 0, n2 = 0;
Treap<i64> t1, t2;
z1[n1++] = nums[0]; t1.insert(nums[0]);
z2[n2++] = nums[1]; t2.insert(nums[1]);
for (int i = 2; i < n; i++) {
int v1 = t1.gtcnt(nums[i]);
int v2 = t2.gtcnt(nums[i]);
int to = 0;
if (v1 > v2) {
to = 1;
} else if (v1 < v2) {
to = 2;
} else {
if (n1 <= n2) {
to = 1;
} else {
to = 2;
}
}
if (to == 1) {
z1[n1++] = nums[i]; t1.insert(nums[i]);
} else {
z2[n2++] = nums[i]; t2.insert(nums[i]);
}
}
for (int i = 0; i < n2; i++) {
z1[n1++] = z2[i];
}
return z1;
}
};
浙公网安备 33010602011771号