後面的總結可能有錯誤的地方 發現請指出 畢竟 也是從別人呢裡搬的有 也有自己的總結!
1019 逆序數
基準時間限制:1 秒 空間限制:131072 kb 分值: 0
難度:基礎題
在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。
input
第1行:n,n為序列的長度(n <= 50000)output 1第2 - n + 1行:序列中的元素(0 <= a[i] <= 10^9)
輸出逆序數input示例
424output示例31
4
#include#includeusing namespace std;
int a[100001],c[100001];
int sum=0;
void merges(int l,int mid,int r)
else
}while(p<=mid) c[q++]=a[p++];
while(m<=r) c[q++]=a[m++];
for(int j=l;j>n;
for(j=0;j>a[j];
}merge_sort(0,n-1);
cout<
歸併排序: 如 2 4 3 1 先將資料分成 2 , 4, 3, 1,四個陣列; 之後結合 2,4 和 3,1 將陣列 2,4和 3,1 排序 變為 用另外乙個陣列儲存(c
先讓 2和1比較 1比較小 儲存在c0中 之後2和3比較 c1=2, 4,3比較 c2=3 c3=4;
//將有序陣列a和b合併到c中void
merge(
inta,
intn,
intb,
intm,
intc)
while
(i c[k++] = a[i++];
while
(j c[k++] = b[j++];
} 這個是兩個陣列 a,b,c將 a,b合併到 c之中
如何將 乙個陣列 合併到另乙個陣列之中呢: 加入乙個中間 值 mid
//將a的兩部分有序數列a[first...mid]和a[mid+1...last]合併void
merge(
inta,
intleft(左邊),
intmid,
intright(右邊),
intc)
while
(i <= m)
c[k++] = a[i++];
while
(j <= n)
c[k++] = a[j++];
for(i = left; i
a[i]=c[i];
} 之後就是 反覆呼叫函式對整個陣列的排序
voidmerge_sort(
inta,
intfirst,
intlast,
intc) }
可是歸併排序 和 你逆序數 有個卵子關係呢? 不要著急 我們回到開頭 說到 每次排序都會將小的排到前面 比如 3 1 在排序的時候我們會將 1排在3前面
看到這裡還是懵逼啊 這特麼怎麼算啊 呼叫函式這麼多次 我怎麼知道啊? 怎麼找 ? 不要著急 我們在來回頭看一下 將乙個陣列合併的程式 咦 然後就發現了這個 語句
while(i <= m && j <= n)
這個是什麼 是關鍵啊! 咱們假設這會 a陣列 就是 這兩個 來來來 一步一步來 第一步 :
注意else first:2 1比較 發現else c0=1 這個時候我們發現 最小的跑到最前面了對不對 這個時候我們就需要記錄了!!! 可是問題又來了 怎麼記錄呢? 我們發現 如果 a[j] 小於 a[i] 的話 a[j]會小於
a[mid-i] 所有的數 仔細想一下 我們之前已經將 陣列排好序了都是按照公升序排列 對吧! 所以當 else 的時候 我們會發現 sum需要加上 mid-i+1 (mid是a[i]的最後乙個數 所以需要加上1
看到這裡我們理解了嗎? 就是這樣 以上有別的部落格的 也有自己總結的~ 寫到 一點 省賽剛剛結束 打了鐵 發現自己弱的要死 以後穩紮穩打 學乙個演算法必須學會 ! 不然什麼都要忘記! for acm come on!
逆序數(51Nod1019) 歸併排序
1019 逆序數 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數...
51Nod 1019 逆序數 歸併排序
1019 逆序數 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數...
51 nod 1019 逆序數(歸併排序)
1019 逆序數 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 收藏 關注 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是...