P1908 逆序對 (樹狀陣列)

2022-01-12 18:34:11 字數 1454 閱讀 8904

比較喜歡線段樹,懶得用樹狀陣列(只會套模板,位運算的精髓沒有領悟到),一直沒有記錄樹狀陣列**,又得撿回來,趁這道題記錄一下模板,為三維偏序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輸入輸出格式 輸入格式 第一行,乙個數...