關於樹狀陣列,相信大家都已經比較熟悉了。。。
那麼,我們就先來砍一刀例題(嘻嘻)
輸入給出n以及n個數,求這其中的逆序對個數
ps:逆序對,就是序列中ai>aj且i嗯。。。
這一題,很多人應該都會選擇歸併求逆序對吧。。。
但是,樹狀陣列求逆序對我們也應該要掌握掌握的說。
那麼,想讓我們想一想,逆序對應該怎麼快速求呢?
我們可以倒著列舉。
void
add(
int x)
inttotal
(int x)
for(
int i=n;i>
0;i--
)add
(c[i]
),ans+
=total
(c[i]-1
);
因為ai<=10^9,我們很容易就能想到離散化
這個離散化呢,還要小心一點就是相等的情況。
n=
read()
;//read()為讀入優化
for(
int i=
1;i<=n;i++
) a[i]
=(node)
;sort
(a+1
,a+n+
1,cmp)
;c[a[1]
.num]=1
;for
(int i=
2;i<=n;i++
)
這樣,我們就能簡單而又容易地打出**啦!
#include
#include
#define ll long long
#define lowbit(x) x&-x
#define n 500010
using namespace std;
struct nodea[n]
;ll ans=
0,t[n]
=,c[n]
;int n,tot=1;
inline
intread()
intcmp
(node x,node y)
void
add(
int x)
ll total
(int x)
intmain()
;sort
(a+1
,a+n+
1,cmp)
;c[a[1]
.num]=1
;for
(int i=
2;i<=n;i++
)for
(int i=n;i>
0;i--
)add
(c[i]
),ans+
=total
(c[i]-1
);printf
("%lld\n"
,ans)
;return0;
}
樹狀陣列求逆序對
題目描述 給定乙個陣列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 前面的 有乙個...