樹狀陣列的應用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...