zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    DevOps Workshop 研发运维一体化(北京第二场) 2016.04.27
    DevOps Workshop 研发运维一体化(成都站) 2016.05.08
    TFS 2015 生成不输出任何结果
    挂起的更改中的“解析”是什么意思?原来是微软错误的翻译
    微软研发流程(ALM)管理培训会议(比亚迪汽车)
    TFS实战培训
    【实战TFS】【QQ群】了解别人是如何使用TFS的
    DevOps Workshop 研发运维一体化(广州站)
    制作Visual Studio 2017 (VS 2017) 离线安装包
    在每页(分页)报表中重复显示标题
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12859219.html
Copyright © 2011-2022 走看看