HDU 3874 Necklace 樹狀陣列的應用

2021-12-29 21:27:33 字數 1233 閱讀 7747

題意:有一些數,這些數中有重複的,問從[l,r]區間的和是多少,重複的數只能算一次。

思路:因為有多次詢問,所以暴力的話肯定超時,又因為是區間求和問題,所以可以考慮用樹狀陣列求。樹狀陣列可以解決沒有重複數的情況,因此這道題我們可以特殊處理一下。首先我們可以把所有的詢問都存起來,然後對詢問按右端點排序,然後每次詢問,對於排序後的每次詢問,我們只考慮到該區間的右端點,並且記錄每個數最後出現的位置,若出現相同的數,則需要從該數的位置開始減去該數。

**:[cpp] 

#include  

#include  

#include  

#include  

#include  

#include  

#include  

#include  

using namespace std; 

const int n = 50010; 

const int m = 200010; 

int dit[n]; 

__int64 num[n]; 

__int64 ans[m]; 

struct intervalrr[m]; 

bool  cmp(interval a,interval b) 

int inline lowbit(int x) 

void inline update(int x,int add) 

} __int64 inline sum(int x) 

return s; 

} int main() 

scanf("%d",&m); 

for(int i = 0; i < m; ++i) 

sort(rr,rr+m,cmp); 

memset(num,0,sizeof(num)); 

memset(ans,0,sizeof(ans)); 

mp.clear(); 

int rp = 1; 

for(int i = 0; i < m; ++i) 

update(rp,x); 

mp[x] = rp; 

rp++; 

} ans[rr[i].id] = sum(rr[i].rp) - sum(rr[i].lp - 1);  

} for(int i = 0; i < m; ++i) 

} //system("pause"); 

return 0; 

Hdu 3874 Necklace 樹狀陣列

題意 詢問某一區間的值之和,相同元素只算一次 思路,樹狀陣列求解,由於區間相同元素只算一次,採用離線演算法,把區間右端點從小到大排序,按順序處理。首先我們找到乙個點時,記錄它的下標,若在後面還有與它相同的元素,我們把之前的元素去掉,插入到當前位置,每次進行這樣的一次處理,就要判斷一下,處理後該點有沒...

HDU 3874 Necklace 樹狀陣列

題意 求區間內不同的數的和 離線處理,按查詢右端點從小到大排序,從左往右掃一遍。記錄每個數出現的上乙個位置,如果該數之前沒有出現過,就加上,否則就在上乙個位置減去。include include include include define ll long long int using namesp...

HDU 3874 Necklace 莫隊演算法

題目 題意 給定乙個陣列,每次詢問乙個區間 l,r 求區間內所有數字的和,出現多次的數字只加一次 思路 莫隊演算法掃一遍即可,注意會爆int。我陣列開小了不少re而是tle,蛋疼。include include include include include include using namesp...