之前不知道逆序數是什麼,今天才了解了一下,主要樸素的方法是n^2的,所以可以用歸併排序,線段樹還有樹狀陣列三種方法來做。
先學了歸併排序的做法,發現還是挺簡單的。~~
#include#include#includeusing namespace std;
const int maxn = 5e5+5;
int num[maxn],p[maxn];
long long cnt;
void hhsort(int *num,int left,int mid,int right,int *p)
}while(i <= mid)
p[k++] = num[i++];
while(j <= right)
p[k++] = num[j++];
for(i = 0;i < k;i++)
num[left + i] = p[i];
}void qqsort(int *num,int left,int right,int *p)
}int main()
return 0;
}
後面再補上樹狀陣列的方法--------------
還是忘了開long long wa了一發,orz。
樹狀陣列的做法主要是要了解乙個方法,定義乙個為0的陣列p【n】,把給的數列按從大到小的順序插,插入乙個就把當前位置p【i】+1,再看p【i】之前有木有插過數字,即getsum(i-1).,最後把這些都加起來,就是逆序數的個數,最後的總數加起來會爆int,所以別忘了cnt定義為longlong~
樹狀陣列寫起來就是很短,不錯~
#include#include#include#includeusing namespace std;
struct nu num[500005];
int n,p[500005];
long long cnt;
bool cmp(nu a,nu b)
int lowbit(int t)
int getsum(int t)
return tt;
}void add(int t,int x)
cnt += getsum(ss-1);
}int main()
sort(num+1,num+1+n,cmp);
cnt = 0;
for(int i = 1;i <= n;i++)
printf("%i64d\n",cnt);
}return 0;
}
求逆序數 逆序數 歸併排序
求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...
歸併排序 求逆序數
首先需要了解逆序對的概念 如果在乙個序列 數列中,滿足 則ax和ay稱為一對逆序對。現在考慮乙個問題 對乙個大小為n 即有n個元素 元素隨機無序且唯一的整數序列中,平均有多少個逆序對?乙個構造證明的方法如下 設乙個隨機無序且元素唯一的整數序列為 我們令lr為l的反向序列,即 然後在lr中任取兩個數,...
歸併排序求逆序數
輸入 n 陣列中元素個數 x 最後所存在的每對逆序對所需要花費的錢 y 按任意順序交換陣列中相鄰兩個元素所要花費的錢 n個陣列中元素 輸出 求使陣列變為公升序所需要的最少 即求該陣列的逆序數 按陣列順序 任意順序交換次數均為該陣列的逆序數次 歸併排序求逆序數 歸併排序採用分治策略 ex 重點在於合併...