HDU 3333 線段樹 離線處理

2021-12-30 01:07:48 字數 1006 閱讀 9529

hdu 3333 線段樹+離線處理:問你給定區間內的不重複的數字的和,如1 1 1 3 4 ,區間1到2就是1,區間1到5就是8。

這種線段樹只能離線來寫,離線的方法是按照查詢區間的右端點來排序,然後這道題目的資料範圍較大需要離散化簡單處理一下,然後對於輸入的每個點來說,順序走下去。

然後如果當前點之前出現過,便將之前的刪除然後把現在的新增線段樹中,為什麼這麼可以,看了網上神犇一句話,那就是對於要查詢的區間,它的右端點固定後,那麼重複的數字便是右面開始最後一次出現的,我看到這句話突然來了靈感,自己寫了一發還對了,如果看到這大家有思路了就不要看**了,還是很好想的。

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int inf=0x3f3f3f3f;

const ll inf=0x3f3f3f3f3f3f3f3fll;

const int maxn=30010;

ll num[maxn<<2];

void update(int pos,int val,int le,int ri,int node)

int t=(le+ri)>>1;

if(pos<=t) update(pos,val,le,t,node<<1);

else update(pos,val,t+1,ri,node<<1|1);

num[node]=num[node<<1]+num[node<<1|1];

}ll query(int l,int r,int le,int ri,int node)

struct edgeb[maxn*4];

bool cmp2(const edge &a,const edge &b){

return a.num1

HDU 3333 離線線段樹

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

hdu3333 線段樹,離散化,離線操作

求區間不同數字的和 先將資料離散化,離線操作就是要先將問題儲存起來,根據一定的順序解答來降低複雜度 這題就將問題儲存起來後按右邊界排序,之後從左到右逐個點的建立線段樹,同時標記一下這個值是否出現過和位置,如果之前出現過,就把之前出現的點清零再在當前點插值,同時看當前的點有沒有剛剛排好序的問題的右邊界...

HDU 3333 線段樹 離散化

只查詢區間不同的數的和 思路好題 對查詢離線 不斷的往每個位置插值 並把前面位置的值置為0 每查到乙個右端點 查詢一下 等價操作的轉換 離散化一下 include define mem a,b memset a,b,sizeof a define lson root 1 define rson ro...