- 归并排序(不在这阐述)
- 树状数组
- 如果想练习《Trie树》,其实可以用Trie树做。因为我用的是Trie求逆序对,所以分享一下
首先,先将第二行的名字重新赋值为第一行的顺序编号
如:
4
S H J A
-------
A J S H
4 3 1 2
然后,我们将这些数储存在a数组中
接着,按序加入01Trie中,
再接着,如果该位为0,且存在1
那么,若记cnt为该节点下一共有多少子树
则,sum+=cnt
没听懂
上代码
int work ( int x ){
int p = 1 ;
int sum = 0 ;
for ( int i = 1 ; i <= 31 ; ++i , x >>= 1 ){
b[i] = ( x & 1 ) ;
}
for ( int i= 31 ; i >= 1 ; --i ){
if ( trie2[p][b[i]] == 0 ) trie2[p][b[i]] = ++tot2 ;
p = trie2[p][b[i]] ;
cnt[p]++ ;
}
p = 1 ;
for ( int i = 31 ; i >= 1 ; --i ){
if ( b[i] == 0 && trie2[p][1] ){
sum += cnt[trie2[p][1]] ;
}
p = trie2[p][b[i]] ;
}
return sum ;
}
接下来,只需定义ans,并累加起 每个sum
记得开 LONG LONG