樹狀陣列求逆序對其實挺簡單的
1.將要求的陣列離散化
離散化將每乙個數的值變為該數在陣列中的大小
inline bool cmp(int x, inty)for(int i = 1; i <= n; i ++) a[i] = read(), p[i] =i;
sort(p + 1, p + n + 1
, cmp);
for(int i = 1; i <= n; i ++) a[p[i]] = i;
cmp函式,按照該座標處的數由小到大排序
2.將每個數依次插入樹狀陣列
1.每次插入查詢 0 -> 該數 的值(因為已經離散化成大小,所以a的值為 1 -> n)
2.用 i - 1 - 查詢的值 計入ans
因為比該數小且在改數前的數一定會被查詢到
3.將該數加入樹狀陣列
#include #include#include
#include
using
namespace
std;
const
int n = 40010
;int
a[n], p[n], c[n];
intn;
intread()
while(c >= '
0' && c <= '
9') x = x * 10 + c - '
0', c =getchar();
return x *f;
}inline
bool cmp(int x, int
y)inline
int ask(int
x)
return
ret;
}void add(int
x)
return;}
intmain()
printf("%d
", ans);
return0;
}
樣例
65 4 2 6 3 1
11
樹狀陣列求逆序對
題目描述 給定乙個陣列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 前面的 有乙個...