比較喜歡線段樹,懶得用樹狀陣列(只會套模板,位運算的精髓沒有領悟到),一直沒有記錄樹狀陣列**,又得撿回來,趁這道題記錄一下模板,為三維偏序cdq套樹狀陣列鋪墊一下。
解題思路:先對原陣列a從大到小排序,依次新增進樹狀陣列c裡,每次求字首和的結果就是 當前數的逆序對的個數。
例如資料:55,44,22,66,33,11
初始化樹狀陣列c,清0;
新增66到4號位,則新增陣列為 0,0,0,1,0,0; 66前沒有比它大的數,逆序對個數為0,樹狀陣列c為0,0,0,1,0,0;
新增55到1號位,則新增陣列為 1,0,0,1,0,0; 55前沒有比它大的數,逆序對個數為0,樹狀陣列c為1,1,0,2,0,0;
新增44到2號位,則新增陣列為 1,1,0,1,0,0; 44前有55比它大,逆序對個數為1,樹狀陣列c為1,2,0,3,0,0
新增33到5號位,則新增陣列為 1,1,0,1,1,0; 33前有55,44,66比它大,逆序對個數為3,樹狀陣列c為1,2,0,3,1,1
新增22到3號位,則新增陣列為 1,1,1,1,1,0; 22前有55,44,66比它大,逆序對個數為2,樹狀陣列c為1,2,1,4,1,2
新增11到6號位,則新增陣列為 1,1,1,1,1,1; 11前有55,44,22,66,33比它大,逆序對個數為5,樹狀陣列c為1,2,1,4,1,2
坑:如果有相同的數,則排序時按照後面的先新增,這樣就不會重複計算逆序對。
#include#include#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define inf 0x3f3f3f3f
const
double pi=3.1415926
;using
namespace
std;
const
int maxx=500005
;struct
node
;node a[maxx];
///原陣列
int c[maxx];///
樹狀陣列
intn;
bool
cmp(node p1,node p2)
int lowbit(int
x)void add(int x,int val)///
在x的位置新增val值
}int sum(int
x)
return
res;
}int main()///
p1908
printf(
"%lld\n
",ans);
return0;
}
P1908 逆序對 樹狀陣列
p1908 題目描述 貓貓 tom 和小老鼠 jerry 最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom 老貓查閱到乙個人類稱之為 逆序對 的東西,這東西是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中 ai aj且 iupdate...
P1908 逆序對 樹狀陣列解法)
題目描述 貓貓 tom 和小老鼠 jerry 最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom 老貓查閱到乙個人類稱之為 逆序對 的東西,這東西是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中 ai aja i a ja i a j ...
洛谷P1908 逆序對(樹狀陣列)
題目描述 貓貓tom和小老鼠jerry最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom老貓查閱到乙個人類稱之為 逆序對 的東西,這東西是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中ai aj且i輸入輸出格式 輸入格式 第一行,乙個數...