首先建立乙個陣列,範圍是原陣列中的最大值,該陣列用於存放某乙個數字出現的次數,從最後乙個數字開始計算,求逆序對其實就是乙個數字前面有多少個比它大的數字,換句話說就是乙個數後面有多少個比自己小的數字,我們既然是倒序求解的,那就可以保證在求解乙個位置的數字的逆序的時候,後面的位置的值我們計算過了並且知道後面的數字的大小,可以用樹狀陣列維護乙個(數字已經出現次數的)區間和,每次計算的時候查詢一下比自己小的數字的個數和(字首和)即可,更新的時候,單點更新一下當前數字出現的次數和比它大的數字出現的次數和
#include #include using namespace std;
int a[100], b[100];
int n;
int lowbit(int x)
void add(int x)
}int query(int x)
return res;
}int main()
printf("%d", res);
//res計算的是整個數字的逆序數
return 0;
}
樹狀陣列求逆序對
題目描述 給定乙個陣列a,它包含n個整數,分別是a 1 a 2 a n 如果存在下標i和j,使得 i j 且 a i a j 同時成立,則 i,j 就為乙個 逆序對 那麼a陣列總共有多少對不同的 逆序對 輸入格式 1247.in 第一行為n 1 n 100000 接下來是n行,每行乙個長整型範圍內的...
樹狀陣列求逆序對
很久以前就學了樹狀陣列,也知道可以用來求逆序對,然而一直沒弄明白他是怎麼實現的 可能當時沒搞清楚逆序對是什麼吧。逆序對就是如果i j a i a j 這兩個就算一對逆序對,簡單來說,所有逆序對的個數和就是找每乙個數的前面有幾個比他的大的數,他們加起來的和就是逆序對的總數。知道什麼是逆序對後就好辦了,...
樹狀陣列 求逆序對
樹狀陣列可以解決線段樹能夠解決的問題,且更加節省空間。線段樹的講解 可以看這位大佬的部落格 樹狀陣列的講解 另一位大佬的部落格 這裡主要寫一下利用樹狀陣列來求解逆序對的個數。簡單來說就是一段序列裡面每個數所在位置之前的位置上比這個數大的數字個數之和。例如 1 2 3 5 4 只有 4 前面的 有乙個...