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 分別進行歸併排序,然後再將這兩半合併起來。在合併的...