題目鏈結:逆序數
解題思路:逆序數模板題,將數值離散化後把求值的逆序數轉化成求其rank的逆序數。利用樹狀陣列提公升標記陣列的效率。注意i - get_sum(rnk[i])表示在長度為i,或者說第i個數,之前排名比他大數量。
ac**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
(int
)1e5+5
;typedef
long
long ll;
ll sum;
int c[maxn]
,val[maxn]
,tmp[maxn]
,rnk[maxn]
,n;inline
int lowbit (
int a)
inline
void add (
int idx,
int num)
}inline ll get_sum (
int idx)
return ans;
}void
solve()
sort
(tmp +
1, tmp +
1+ n)
;int len =
unique
(tmp +
1, tmp +
1+ n)
- tmp -1;
for(
int i =
1; i <= n; i++
)//從比較val的值轉化成維護其rnk 找rnk逆序數
memset
(c,0
,sizeof
(c))
; sum =0;
for(
int i =
1; i <= n; i++)
cout << sum <<
'\n';}
intmain()
51nod 1019 逆序數(逆序數 離散化)
在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。input 第1行 n,n為序列的長度 n 5000...
inv 線段樹,逆序對,離散化
問題描述 給定n,以及a1,a2,an,求所有的數對 i,j 同時滿足 1 i j 2 2ai aj 輸入檔案 輸入檔案 inv.in第一行n 接下來n行,每行乙個整數,第i行的整數為ai 輸出檔案 輸出檔案inv.out包含一行乙個整數,表示滿足條件的數對的個數 輸入樣例 3 4 6 8 輸出樣例...
求逆序數數目(樹狀陣列 離散化)
404在玩忍者印記 mark of the ninja 操縱忍者時遇到這樣乙個場景,兩棟大樓之間有許多繩索,從側面看,就像這個樣子 我們的忍者非常有好奇心,他可以觀察到每個繩索的端點在兩棟樓的高度,想知道這些繩索有多少個交點 圖中黑色的點 他觀察到不會建築上不會有一點上有兩個繩索,並且沒有三條繩索共...