演算法筆記 歸併排序求逆序對 經典模板例題

2021-08-21 06:02:38 字數 1191 閱讀 1728

jzabc除了對多公尺諾骨牌感興趣外,對賽車也很感興趣。上個週末他**了一場賽車比賽。他總是能想出許多稀奇的問題。某一時刻,他看到有n輛車(總是勻速行駛)在同一直線上,並且處在乙個無限長度的直道上,而且n輛車有嚴格的先後之分。他通過特殊的器材測出了每一輛車的速度。那麼問題出現了,如果有兩輛車a車和b車,a車在b車的後面,並且a車的速度比b車的快,那麼經過一段時間後,a車一定會超過b車。我們稱之為一次超車。那麼他想請你幫忙計算超車總數。我們記車道起點的座標為0。沒有兩輛車的座標相同。

第一行,乙個數n,車輛總數。

第二行至第n+1行,為n輛車的資訊

每行有兩個正整數x,y,x和y之間有乙個空格

x為車的座標,y為車的速度

0一行,超車總數

input

2

5 62 8

output

1
根據汽車的起始點進行排序,然後將思路轉化一下,就是求逆序對的個數,那麼我們再歸併一下即可。

#includeusing namespace std;

long long n;

long long ans=0;

long long cnt=0;

struct mergevar

car[1000000]={};

long long noused[10000000]={};

inline bool cmp(mergevar x,mergevar y)

else noused[temp++]=car[l++].v;

}if (r<=right)

for (;r<=right;r++) noused[temp++]=car[r].v;

else

for (;l<=mid;l++) noused[temp++]=car[l].v;

for (long long i=left;i<=right;i++) car[i].v=noused[i];

}else

if (right-left==1)

if (car[right].v>n;

for (long long i=1;i<=n;i++)

cin>>car[i].pos>>car[i].v;

sort(car+1,car+n+1,cmp);

mergesort( 1 , n );

cout<

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

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

歸併排序求逆序對

排序都用qsort了,別的排序演算法不怎麼用,但有些排序的思想很重要。碰到一道求逆序對的題,要用到歸併排序,學習了一下歸併排序。歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟 分解 將n個元素分成個含n 2個元素的子串行。解決 用合併排序法對兩個子串行遞迴的排序。合併 合併兩個已排序的子串行...

歸併排序求逆序對

我們知道,求逆序對最典型的方法就是樹狀陣列,但是還有一種方法就是merge sort 即歸併排序。實際上歸併排序的交換次數就是這個陣列的逆序對個數,為什麼呢?我們可以這樣考慮 歸併排序是將數列a l,h 分成兩半a l,mid 和a mid 1,h 分別進行歸併排序,然後再將這兩半合併起來。在合併的...