樹狀陣列的應用

2021-08-03 13:19:57 字數 1260 閱讀 6330

樹狀陣列的應用1:求逆序數

-首先考慮將輸入陣列離散化,因為題目要求輸入的數值可以達到10的9次方,肯定不會開出那麼大的陣列。

1.定義乙個結構體 val儲存原值,pos儲存原來在陣列中的位置

2.在對原結構體陣列對val值排序

3.定義儲存離散化資料的陣列flect,flect[node[i].pos] = i; 

eg: 位置   : 1 2 3 4 5

原陣列:9 0 1 5 4

排序後 : 0 1 4 5 9         //flect[node[i].pos]  其中i=1的時候,排序後的node[1] 原來陣列中最小的數,離散化之後當然賦值為最小的1啦;

flect陣列:5 1 2 4 3

-其次考慮如何利用getsum得到逆序數對的個數

1.首先初始化陣列c,乙個個將flect陣列插入到樹上去,每插入乙個數,就將該節點的值以及各父節點值+1;

2.利用getsum(flect[i])得到的值是這個數的前方有多少個小於它的數,再用i(已經插入的數的個數)減去getsum的返回值,就是比它大的數的個數

#include using namespace std;

const int ax = 50000+666;

struct nodenode[ax];

int flect[ax];

int c[ax];

int n;

bool cmp(node a,node b)

return sum;

}int main()

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

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

/*for(int i=1;i<=n;i++)

void updata(int x)

return ans;

}

poj3264:查詢最大最小值之差

#include #include #include using namespace std;

const int maxn = 3e5;

int a[maxn], h[maxn];

int n, m;

int lowbit(int x)

void updata(int x)

return ans;

}int main()

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

}return 0;

}

樹狀陣列的應用

include include define lowbit i i i const int maxn 100010 int c maxn 樹狀陣列 getsum函式返回前x個整數之和 int getsum int x return sum 返回和 update函式將第x個整數加上v void upd...

樹狀陣列應用

一維樹狀陣列常用的3 個函式 int lowbit int x 取x的最低位1,比如4,則返回4,如5,則返回1 void update int i,int val 將第i個元素增加val int sum int i 求前i項的和 return s 以下陣列下標均預設從1開始 應用一假如給你乙個陣列...

數星星(樹狀陣列的應用)

1265.數星星 天空中有一些星星,這些星星都在不同的位置,每個星星有個座標。如果乙個星星的左下方 包含正左和正下 有 k k k 顆星星,就說這顆星星是 k k k 級的。例如,上圖中星星 5 5 5 是 3 3 3 級的 1,2 4 1,2,4 1,2,4 在它左下 星星 2,4 2,4 2,4...