分治的基本思想可以概括为:

递归处理左区间和右区间,在计算答案时,合并两个子问题,即考虑左半区间内的修改对右半区间内产生的影响。也就是,用左边的子问题来帮助解决右边的子问题。

【排序】归并排序:逆序对的个数_leetcode

 

#include<iostream>
using namespace std;
const int N=100001;
int q[N],temp[N];
int n;
long long merge_sort(int l,int r){
   if(l>=r)return 0;
   int mid=l+r >> 1;
   int i=l;int j=mid+1;
   int k=0;
   long long res=0;
    //递归算左右区间的逆序对
   res+=merge_sort(l,mid)+merge_sort(mid+1,r);
   //归并排序算左右逆序对
   while(i<=mid&&j<=r){
       if(q[i]<=q[j])temp[k++]=q[i++];
       else{
           temp[k++]=q[j++];
           res+=mid-i+1;
       }
   }
   while(i<=mid)temp[k++]=q[i++];
   while(j<=r)temp[k++]=q[j++];
   for(int i=l,k=0;i<=r;k++,i++)q[i]=temp[k];
   return res;
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>q[i];
    }
    cout<<merge_sort(0,n-1);
    return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.