洛谷P1908 逆序對(樹狀陣列)

2021-08-01 07:08:52 字數 1327 閱讀 6680

題目描述

貓貓tom和小老鼠jerry最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom老貓查閱到乙個人類稱之為「逆序對」的東西,這東西是這樣定義的:對於給定的一段正整數序列,逆序對就是序列中ai>aj且i輸入輸出格式

輸入格式:

第一行,乙個數n,表示序列中有n個數。

第二行n個數,表示給定的序列。

輸出格式:

給定序列中逆序對的數目。

分析:通過暴力o(n^2)我們可以知道只有加一和求和兩種操作,所以我們使用樹狀陣列維護排序後後面比當前位置小的數的個數,邊維護邊求和。

**

const

maxn=50000;

var a,b,c:array[0..maxn] of longint;

i,n,ans:longint;

procedure qsort(l,r:longint);

var i,j,k:longint;

begin

if l>=r then exit;

i:=l;j:=r;

k:=a[(l+r) div 2];

repeat

while a[i]>k do inc(i);

while a[j]j;

qsort(l,j);qsort(i,r);

end;

procedure insert(x:longint);

begin

while x<=n do

begin

inc(c[x]);

x:=x+(x and -x);

end;

end;

function count(x:longint):longint;

var s:longint;

begin

s:=0;

while x>0 do

begin

inc(s,c[x]);

x:=x-(x and -x);

end;

exit(s);

end;

begin

readln(n);

for i:=1 to n do

begin

read(a[i]);

b[i]:=i;

end;

qsort(1,n);

for i:=1 to n do

begin

inc(ans,count(b[i]));

insert(b[i]);

end;

writeln(ans);

end.

P1908 逆序對 樹狀陣列

p1908 題目描述 貓貓 tom 和小老鼠 jerry 最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom 老貓查閱到乙個人類稱之為 逆序對 的東西,這東西是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中 ai aj且 iupdate...

P1908 逆序對 (樹狀陣列)

比較喜歡線段樹,懶得用樹狀陣列 只會套模板,位運算的精髓沒有領悟到 一直沒有記錄樹狀陣列 又得撿回來,趁這道題記錄一下模板,為三維偏序cdq套樹狀陣列鋪墊一下。解題思路 先對原陣列a從大到小排序,依次新增進樹狀陣列c裡,每次求字首和的結果就是 當前數的逆序對的個數。例如資料 55,44,22,66,...

洛谷 P1908 逆序對

題目描述 貓貓tom和小老鼠jerry最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom老貓查閱到乙個人類稱之為 逆序對 的東西,這東西是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中ai aj且i var i,n,t longint ...