codevs 1688 逆序对

来源:互联网 发布:php培训 编辑:程序博客网 时间:2024/04/30 20:09

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold

题目描述 Description
给定一个序列a1,a2,…,an,如果存在i并且ai>aj,那么我们称之为逆序对,求逆序对的数目

数据范围:N<=105。Ai<=105。时间限制为1s。

输入描述 Input Description
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。

输出描述 Output Description
所有逆序对总数.

样例输入 Sample Input
4
3
2
3
2

样例输出 Sample Output
3

#include<iostream>#include<cstdio>using namespace std;int a[100011],zh[100011];unsigned long long k;void mergesoft(int left,int right)  {     if(left==right) return;     int mid=(left+right)/2;     mergesoft(left,mid);     mergesoft(mid+1,right);           int p=left,q=left,j=mid+1;     while(p<=mid && j<=right)     {          if(a[p]>a[j])          {k=k+mid-p+1;zh[q++]=a[j++];}   //若a[p]>a[j],而且我们用分治早已排成升序形式,//得出a[p]到mid之间所有数都会大于a[j],所以k=k+mid-p+1, +1补充我们减去的a[p]          else          zh[q++]=a[p++];             }    while(p<=mid) zh[q++]=a[p++];     while(j<=right) zh[q++]=a[j++];     for(int i=left;i<=right;i++) a[i]=zh[i];}int main(){    int n;    cin>>n;    for(int i=1;i<=n;i++) cin>>a[i];    mergesoft(1,n);    cout<<k;    return 0;}
0 0
原创粉丝点击