題意:求逆序數
題解:可以將數字插入樹狀陣列,每次統計比單前數字小的個數,我們將每個數字的權值設定為1,那麼只要求在他前面數字的和就知道了,對應的逆序數格個數是i-sum(a[i]),這裡使用樹狀 陣列維護區間和
這一題由於數字範圍過大,記憶體無法承受如此大的空間,我們可以看到n最多才5e5,所以最多有n個不同數字,離散化即可,這一題很詭異的是卡stl。。。。。可以使用陣列去對映,記錄下每個數字的原來位置,將數字按公升序排序,這樣再將原來的位置依次插入i,這樣相對的大小規則不會發生變化,求得的逆序數也不會發生變化,這樣就達到了節省空間的目的
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define n int(6e5+10)
#define inf int(0x3f3f3f3f)
#define mod int(1e9+7)
typedef long long ll;
int c[n], n;
int a[n];
struct point
return res;
}int main()
sort(node + 1, node + 1 + n);
for (int i = 1; i <= n; i++)
for (int i = 1; i <= n; i++)
printf("%lld\n", ans);
} return 0;
}
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 ...
poj2299 (樹狀陣列 離散化)
題目鏈結 思路 求n個數組成序列的逆序數,用樹狀陣列優化,由於給出的a i 的範圍很大n較小,所以對資料進行離散化,用結構體記錄每個數的值和原始位置p,對序列排序後給每個數乙個新的值,這個值的範圍為 1,n 這個值只代表乙個相對的大小,形成乙個新的序列nd i 原陣列的逆序數相當於nd i 的逆序數...