日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

求逆序数

發布時間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求逆序数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

                  求逆序數

時間限制:2000 ms ?|? 內存限制:65535 KB 難度:5 描述

在一個排列中,如果一對數的前后位置與大小順序相反,即前面的數大于后面的數,那么它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。

現在,給你一個N個元素的序列,請你判斷出它的逆序數是多少。

比如 1 3 2 的逆序數就是1。

輸入
第一行輸入一個整數T表示測試數據的組數(1<=T<=5)
每組測試數據的每一行是一個整數N表示數列中共有N個元素(2〈=N〈=1000000)
隨后的一行共有N個整數Ai(0<=Ai<1000000000),表示數列中的所有元素。

數據保證在多組測試數據中,多于10萬個數的測試數據最多只有一組。
輸出
輸出該數列的逆序數
樣例輸入
2 2 1 1 3 1 3 2
樣例輸出
0 1
用到合并排序算法
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAX 1000010
#define MN 1000000050
__int64 sum;?int a[MAX];
int L[MAX/2],R[MAX/2];
void merge(int A[],int p,int q,int r)
{
?int n1=q-p+1,n2=r-q,i,j;?
?for (i=1;i<=n1;i++)
??L[i]=A[p+i-1];
?for (i=1;i<=n2;i++)
??R[i]=A[q+i];
?R[n2+1]=L[n1+1]=MN;
?i=j=1;
?for (int k=p;k<=r;k++)
?{
??if(L[i]<=R[j])
???A[k]=L[i++];
??else
??{
???A[k]=R[j++];
???sum+=n1-i+1;
??}
?}
}
void merge_sort(int A[],int p,int r)
{
?int q;
?if(p<r)
?{
??q=(p+r)>>1;
??merge_sort(A,p,q);
??merge_sort(A,q+1,r);
??merge(A,p,q,r);
?}
}
int main()
{
?int t,i,n,num,k;
?scanf("%d",&t);?
?while(t--)
?{??
??scanf("%d",&n);sum=0;
??for(i=1;i<=n;i++)
??{
???scanf("%d",&a[i]);???
??}
??merge_sort(a,1,n);
??printf("%I64d\n",sum);
?}
?return 0;
}

轉載于:https://www.cnblogs.com/qijinbiao/archive/2011/10/15/2213009.html

總結

以上是生活随笔為你收集整理的求逆序数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。