chenfy27的刷题记录

导航

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;
    }
};

posted on 2024-03-20 21:37  chenfy27  阅读(27)  评论(0)    收藏  举报