poj 2299 求逆序數

2022-05-11 04:45:08 字數 1122 閱讀 3578

在只允許相鄰兩個元素交換的條件下,得到有序序列的交換次數=乙個亂序序列的 逆序數

求其逆序數:從左到右找到每乙個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 逆序數 逆序數就是你如果只能交換臨近的兩個數,那麼將乙個序列變為有序序列所需要的最少交換次數 穩定的排序演算法按理來說都可以求,但通常使用歸併排序可以求逆序數,因為它的時間效率還是很高的,之所以遜於快排,還是因為它對空間的占用稍多,而且用到了迭代吧 提到逆序數我都第乙個想到歸併。思路...