思路:我們只需堅守乙個原則,本來就在左邊的堅決不把它換到右邊。也就是相鄰的兩個數,左邊小,右邊大,那麼就不調換。這樣對每個數,只要統計左邊比它大的數的個數。可以從後面開始用樹狀陣列統計比它小的數的個數是一樣的。
#include#include#include
#include
#define maxn 1000010
#define lowbit(x) (x&(-x))
using
namespace
std;
intc[maxn],num[maxn],n,r[maxn];
void
init()
int cmp(int a,int
b)int sum(int
pos)
return
sum;
}void update(int
pos)
}int
main()
__int64 ans=0
;
for(i=n;i>=1;i--)
printf(
"%i64d\n
",ans);
}return0;
}
HDU 3743 樹狀陣列,離散化
其實,我也知道這道題是求逆序數來做的,但是問題來了,怎麼求逆序數,常規的解法肯定是不行的,因為資料量很大,那麼想到能用線段樹來做,是可以的,不過我還沒敲過,既然在看樹狀陣列就用這個做。又因為資料可以達到一百萬,並且資料又用不到,所以可以對資料進行離散化 include include include...
hdu 3887 樹狀陣列
給你一棵樹,每個節點都有個編號。讓你求乙個節點他的子樹中編號比他小的節點有幾個。編號唯一,從1 n,已給出根節點 解 樹狀陣列統計。轉化為線性序列。可以想到的是,若要統計乙個節點,那麼比它小的孩子必須先插完,然後統計就行了。對於乙個節點i來說,只要把所有x那麼對於所有節點來說也是這樣的,從一開始插,...
hdu 3333 樹狀陣列
此題與3743相仿,但本題資料較大,需要用到離散化。如何去掉重複元素呢?採用離線演算法 首先將詢問按右端點從小到大排序,離線處理時,記錄每個元素所在位置,遇到重複元素時,從它之前出現的位置減去這個元素,這樣就是的每個元素總是出現在最後。include include include include ...