hihoCoder39周 归并求逆序对个数

来源:互联网 发布:2016小猪收银系统源码 编辑:程序博客网 时间:2024/05/22 03:22

题意 nlogn求逆序对个数

思路 分治法,利用归并排序,f(l,r)表示区间[l,r]上逆序对的个数。f(l,r) = f(l,mid) + f(mid+1,r) + 前后两个区间的逆序对数(可以在归并的过程中顺便统计)

#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;const int maxn = 100005;typedef long long ll;int a[maxn];int n;ll guiBing(int l,int r){if(l==r)return 0;int mid = (l+r)/2;ll ret = guiBing(l,mid) + guiBing(mid+1,r);vector<int> vec;int i,j;for(i=l,j=mid+1;i<=mid&&j<=r;){if(a[j] >= a[i]){vec.push_back(a[i]);i++;}else{vec.push_back(a[j]);j++;ret += (ll) mid - i + 1;}}for(;i<=mid;i++){vec.push_back(a[i]);}for(;j<=r;j++){vec.push_back(a[j]);}for(i=l;i<=r;i++){a[i] = vec[i-l];}return ret;}int main(){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}printf("%lld\n",guiBing(0,n-1));return 0;}


0 0
原创粉丝点击