題目描述
貓貓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 ...