在只允許相鄰兩個元素交換的條件下,得到有序序列的交換次數=乙個亂序序列的 逆序數
求其逆序數:從左到右找到每乙個ai的
乙個陣列x x[j]=1表示此時有j這個數 x[j]=0表示此時還沒有j這個數 一開始x全部賦值為0
對於每乙個a[i] 求出 x[k]=1 (k這裡用的樹狀陣列實現的這個過程 輔助陣列c[i]表示的是 i點覆蓋的這個面積裡 x=1的個數(回憶一下樹狀陣列這個圖)
這裡a[i]的值會有999,999,999,這麼大 所以還要離散化處理
1 #include 2 #include 3 #include 4#define inf (1<<30)
5using
namespace
std;67
int index[500005],n,num[500005
]; // 注意n寫在外面()
8 __int64 a[500005],c[500005];9
10int cmp(int i,int
j)11
1415
int lowbit(int
x)16
1920 __int64 sum(int
p)21
28return
ans;29}
3031
void update(int p,int
x)32
3839}40
41int
main()
4251 memset(c,0,sizeof
(c));
52 sort(index+1,index+n+1
,cmp);
53for(i=1;i<=n;i++)
54 num[index[i]]=i; //離散化
55 __int64 ans=0;56
for(i=1;i<=n;i++)
5762 printf("
%i64d\n
",ans);63}
64return0;
65 }
樹狀陣列求逆序數 poj 2299
突然想起樹狀陣列了,因為突然想起之前從來沒a掉的那個樹狀陣列求逆序數的題,大概意思就是求乙個陣列用氣泡排序排序後的交換次數,因為資料量為5萬,所以o n n 的冒泡模擬肯定是超時的,所以題目的解法可以有兩種,一種是歸併排序,歸併排序的乙個應用正是求逆序數,而另乙個就是樹狀陣列了。思想就是通過將數乙個...
poj 2299 求逆序對
題目大意 求逆序對 解題思路 分治法,類似於歸併排序。a 1.n 將原問題劃分為2個子問題a 1.n 2 a n 2 1.n 並且兩個子陣列已經排好序了,1.n 2的逆序對已經求好,n 2 1.n的逆序對也已經求好了 所以求兩個子問題之間的逆序對,在歸併排序的過程中,當a i a j 時,逆序對的數...
poj2299 歸併排序求逆序數
poj2299 逆序數 逆序數就是你如果只能交換臨近的兩個數,那麼將乙個序列變為有序序列所需要的最少交換次數 穩定的排序演算法按理來說都可以求,但通常使用歸併排序可以求逆序數,因為它的時間效率還是很高的,之所以遜於快排,還是因為它對空間的占用稍多,而且用到了迭代吧 提到逆序數我都第乙個想到歸併。思路...