poj2299 (樹狀陣列 離散化)

2021-09-30 11:12:07 字數 781 閱讀 7336

題目鏈結 

思路:求n個數組成序列的逆序數,用樹狀陣列優化,由於給出的a[i]的範圍很大n較小,所以對資料進行離散化,用結構體記錄每個數的值和原始位置p,對序列排序後給每個數乙個新的值,這個值的範圍為[1,n],這個值只代表乙個相對的大小,形成乙個新的序列nd[i].原陣列的逆序數相當於nd[i]的逆序數。然後就是普通的樹狀陣列求逆序數(nd[i]前面比nd[i]大的數的個數)啦。

data[i].p12

345data[i].v91

054排序後的位置即新值52

143nd[[i]52

143 注意:逆序數ans為__int64;

#include#includeusing namespace std;

const int num=500005;

struct node

data[num];

int c[num],n,nd[num];

bool cmp(const node &a,const node &b)

return s;

}int main()

sort(data+1,data+1+n,cmp);

for(i=1;i<=n;i++)

c[i]=0;

for(i=1;i<=n;i++)

nd[data[i].p]=i;

ans=0;

for(i=1;i<=n;i++)

printf("%i64d\n",ans);

}return 0;

}

POJ 2299(樹狀陣列,離散化)

題意 求逆序數 題解 可以將數字插入樹狀陣列,每次統計比單前數字小的個數,我們將每個數字的權值設定為1,那麼只要求在他前面數字的和就知道了,對應的逆序數格個數是i sum a i 這裡使用樹狀 陣列維護區間和 這一題由於數字範圍過大,記憶體無法承受如此大的空間,我們可以看到n最多才5e5,所以最多有...

poj 2299 樹狀陣列 離散化

樹狀陣列求逆序數 離散化 求逆序數時,加入當前數字,然後統計大於當前數字的數字個數,題目資料很大,需先將其離散化。include include include define n 500005 define lowbit x x x using namespace std int c n a n s...

POJ 2299 樹狀陣列,離散化

題目大意 求一組數的逆序數有多少個 題目解析 用樹狀陣列做,向下更新,向上求和,因為資料範圍太大,但是每個數都不一樣所以先離散化一下 ac include include include include includeusing namespace std typedef long long ll ...