hdu 3333 樹狀陣列

2022-05-22 07:06:11 字數 810 閱讀 4718

思路:定義乙個map容器用來記錄數ai上次出現的位置。將查詢區間按右邊界公升序進行排序,當插入第i個數ai時,pre[ai]+1---->i的區間就會多乙個不同的數,其值就是ai,那麼可以用update(pre[ai]+1,ai)來儲存,但又不能影響i之後的位置,故用update(i,-ai)來消除。每次對於右邊界時i的查詢區間,只要對其左邊界求和就行了,即sum(qt[i].l)。

#include#include

#include

#include

#include

#define maxn 40010

#define lowbit(x) (x&(-x))

using

namespace

std;

__int64 c[maxn],n,num[maxn],ans[maxn*3

];map

pre;

struct

qt}qt[maxn*3

];__int64 sum(

intpos)

return

sum;

}void update(int

pos,__int64 val)

}int

main()

sort(qt+1,qt+1+q);

int j=1

;

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

}for(i=1;i<=q;i++)

printf(

"%i64d\n

",ans[i]);

}return0;

}

hdu 3333 樹狀陣列

此題與3743相仿,但本題資料較大,需要用到離散化。如何去掉重複元素呢?採用離線演算法 首先將詢問按右端點從小到大排序,離線處理時,記錄每個元素所在位置,遇到重複元素時,從它之前出現的位置減去這個元素,這樣就是的每個元素總是出現在最後。include include include include ...

hdu 3333 離線 樹狀陣列

題目 題意 求乙個區間內不重複數字的和,例如1 1 1 3,區間 1,4 的和為4。分析 我們考慮每個查詢 l,r 現在要求的是這個區間裡不通數的和,所以我們在從左掃到右的過程中,可以用乙個資料結構儲存已經得到的不同的數,到右端點後,然後對區間裡不同的數求和,這樣就可以得到答案了。資料結構可以採用樹...

HDU 3333 離線線段樹

線段樹 給定乙個序列,求區間出現的數的數值和,若有多個,只計算一次 先離散化存數資料 對詢問區間按右節點排序,這樣我們每次維護的都是從前到當前位置,保證其重複元素不累加 跟新節點,對於之前出現過的刪除,並在新位置新增 然後查詢即可 include iostream include algorithm...