排序 逆序對IV

2022-04-10 08:21:51 字數 1316 閱讀 1609

時間限制: 1 sec  記憶體限制: 128 mb

提交: 20  解決: 15

[提交] [狀態] [討論版] [命題人:]

題目描述

「裝滿了鵝卵石的瓶子是滿的嗎?」墨老師曾經這樣問過他的學生。「不是,因為還可以放入小石子、再放入細砂、最後再倒入水。」學生們回答。「那麼從中可以得到什麼啟示呢?」墨老師又問,「啟示我們時間總是可以擠出來的!」乙個聰明的學生搶答。「你說得對!」墨老師微笑道,「但我還要告訴你們另乙個重要經驗,那就是:如果你不先將大的鵝卵石放進瓶子裡去,你也許以後永遠沒機會再把它們放進去了。」

但這世上的很多人,做事卻經常分不清事情的輕重緩急。我們可愛的典獄長大人就犯了這個錯誤,當他看到身高參差不齊的獄警們排成一列時,眉毛擰成了乙個結,他最想知道的就是,到底有多少個獄警逆序排隊了。這可以抽象為求逆序對的個數問題:即對於乙個包含n個非負整數的陣列a[1,…,n],如果有i < j,且a[ i ]>a[ j ],則稱(a[ i] ,a[ j] )為陣列a中的乙個逆序對。

例如,陣列(3,1,4,5,2)的逆序對有(3,1),(3,2),(4,2),(5,2)共4個。

輸入包括兩行,第一行是乙個整數n(1≤n≤1000),表示獄警人數。第二行包含n個整數,用空格分隔,即每個獄警的身高,獄警身高均在int範圍內。

輸出包括一行,這一行只包含乙個整數,即逆序對的個數。

樣例輸入

5

3 1 4 5 2

樣例輸出

4

分析:不懂為什麼要排序,這資料才1000,暴力算o(n^2)也不可能超時。。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#define range(i,a,b) for(int i=a;i<=b;++i)

#define ll long long

#define rerange(i,a,b) for(int i=a;i>=b;--i)

#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))

using

namespace

std;

int n,num[1005

];void

init()

void

solve()

intmain()

view code

演算法筆記 歸併排序 逆序對 求逆序對

洛谷p1908 逆序對 wustoj 1850 求逆序對 題目描述 1003 求逆序對 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。input 第一行為n,表示序列長度,接下來的一行包含n個整數 a1,a2,an 表示序列中的n個數。n 105,ai 1055...

逆序對 (歸併排序)

逆序對的nlogn方法,改進後的歸併排序 給定排列p,求排列的逆序對數量。p的長度 100000。要求o nlogn 定義歸併排序過程merge l,r merge l,r merge l,mid merge mid 1,r count l,mid,mid 1,r 只需要考慮左右兩段之間造成的逆序對...

歸併排序 逆序對

按照劉汝佳說的,歸併排序分三步 1.劃分問題,即把序列分成元素盡量相等的兩半 2.遞迴求解 3.合併子問題 其實就是把乙個序列不斷的二分,直到只有兩個元素的時候,然後排序,然後返回,再排序。先上 include using namespace std long long a 100005 t 100...