題意:有一些數,這些數中有重複的,問從[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...