• LC 493. Reverse Pairs


    link

     Fenwick Tree:

    class Solution {
    public:
        int n;
        int reversePairs(vector<int>& nums) {
            n=nums.size();
            vector<int> copy=nums;
            sort(copy.begin(),copy.end());
            vector<int> fenwick(n+1);
            int res=0;
            for(int i=n-1;i>=0;i--){
                int idx=binarysearch(copy,nums[i]);
                if(idx>=0){
                    res+=query(fenwick,idx);
                }
                int curidx=binarysearch2(copy,nums[i]);
                update(fenwick,curidx);
            }
            return res;
        }
        
        int query(vector<int>& fenwick, int idx){
            idx++;
            int res=0;
            while(idx>=1){
                res+=fenwick[idx];
                idx-=(idx&-idx);
            }
            return res;
        }
        
        void update(vector<int>& fenwick, int idx){
            idx++;
            while(idx<=n){
                fenwick[idx]++;
                idx+=(idx&-idx);
            }
        }
        
        int binarysearch(vector<int>& copy, int val){
            int left=0;
            int right=n-1;
            while(left<=right){
                int mid=left+(right-left)/2;
                if((long long)2*copy[mid]<val){
                    left=mid+1;
                }else right=mid-1;
            }
            return right;
        }
        
        int binarysearch2(vector<int>& copy, int val){
            int left=0;
            int right=n-1;
            while(left<=right){
                int mid=left+(right-left)/2;
                if(copy[mid]>=val) right=mid-1;
                else left=mid+1;
            }
            return left;
        }
    };

    segment tree:

    class Solution {
    public:
        int n;
        vector<int> seg;
        int reversePairs(vector<int>& nums) {
            n=nums.size();
            vector<int> copy=nums;
            sort(copy.begin(),copy.end());
            seg=vector<int>(n<<2);
            int res=0;
            for(int i=n-1;i>=0;i--){
                int lastidx=binarysearch(copy,nums[i]);
                if(lastidx>=0){
                    res+=query(0,0,n-1,0,lastidx);
                }
                int curidx=binarysearch2(copy,nums[i]);
                update(0,0,n-1,curidx);
            }
            return res;
        }
        
        int query(int idx, int left, int right, int qleft, int qright){
            if(qleft>right || qright<left) return 0;
            if(qleft<=left && qright>=right) return seg[idx];
            int mid=left+(right-left)/2;
            int l=query(idx*2+1,left,mid,qleft,qright);
            int r=query(idx*2+2,mid+1,right,qleft,qright);
            return l+r;
        }
        
        void update(int idx, int left, int right, int targetidx){
            if(left>targetidx || right<targetidx) return;
            if(left==right){
                seg[idx]++;
                return;
            }
            int mid=left+(right-left)/2;
            update(idx*2+1,left,mid,targetidx);
            update(idx*2+2,mid+1,right,targetidx);
            seg[idx]=seg[idx*2+1]+seg[idx*2+2];
        }
        
        int binarysearch(vector<int>& copy, int val){
            int left=0;
            int right=n-1;
            while(left<=right){
                int mid=left+(right-left)/2;
                if((long long)2*copy[mid]<val){
                    left=mid+1;
                }else right=mid-1;
            }
            return right;
        }
        
        int binarysearch2(vector<int>& copy, int val){
            int left=0;
            int right=n-1;
            while(left<=right){
                int mid=left+(right-left)/2;
                if(copy[mid]>=val) right=mid-1;
                else left=mid+1;
            }
            return left;
        }
    };
  • 相关阅读:
    POJ 1141 Brackets Sequence (区间DP)
    UVaLive 6585 && Gym 100299F Draughts (暴力+回溯)
    UVaLive 6950 && Gym 100299K Digraphs (DFS找环或者是找最长链)
    UVaLive 6588 && Gym 100299I (贪心+构造)
    UVa 1611 Crane (构造+贪心)
    Gym 100299C && UVaLive 6582 Magical GCD (暴力+数论)
    UVa 1642 Magical GCD (暴力+数论)
    UVaLive 6591 && Gym 100299L Bus (水题)
    UVaLive 6581 && Gym 100299B What does the fox say? (模拟+STL)
    HDU 5898 odd-even number (数位DP)
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12859219.html
Copyright © 2020-2023  润新知