普通的陣列,普通的給區間求和,然而這道題要不同的數字,也就是如果有重複數字不能加入到和中
不能有重複數字那麼給線段樹中加乙個數字,如果有重複的那之前的就要刪掉
那麼查區間的時候怎麼辦呢
在新的數字v[n]有效前把前n個數字和(需要查詢的)先算出來
所以先給區間們排序,每次查之前構造範圍內的線段樹//
// main.cpp
// 3333 //
// created by mr.xue on 17/7/26. 年
//#include
#include
#include
#include
using
namespace
std;
map<
long
long
,int
> flag;
long
long
v[30005
],sum[
100005];
struct
node a[
120005];
struct
nodee f[
100005];
bool
cmp(
nodee
a,nodeeb)
void
build(
intl,
intr,
inti)
void
insert(
long
long
v,int
id,inti)
intmid=(
a[i].l+
a[i].r)/
2; if
(id<=mid)
insert
(v,id,i*2);
else
insert
(v,id,i*2+
1); a
[i].
val=
a[i*2].
val+
a[i*2+
1].val; }
long
long
intfind(
intl,
intr,
inti)
intmain()
cin>>m;
for(inti=0
;i sort(f
,f+m,cmp);
intant=1;
for(inti=0
;i sum[f
[i].
id]=
find(f
[i].l,
f[i].r,
1); }
for(inti=0
;i printf
("%lld\n"
,sum
[i]); }
return0;
}
HDU 3333 離線線段樹
線段樹 給定乙個序列,求區間出現的數的數值和,若有多個,只計算一次 先離散化存數資料 對詢問區間按右節點排序,這樣我們每次維護的都是從前到當前位置,保證其重複元素不累加 跟新節點,對於之前出現過的刪除,並在新位置新增 然後查詢即可 include iostream include algorithm...
HDU 3333 線段樹 離散化
只查詢區間不同的數的和 思路好題 對查詢離線 不斷的往每個位置插值 並把前面位置的值置為0 每查到乙個右端點 查詢一下 等價操作的轉換 離散化一下 include define mem a,b memset a,b,sizeof a define lson root 1 define rson ro...
HDU 3333 線段樹 離線處理
hdu 3333 線段樹 離線處理 問你給定區間內的不重複的數字的和,如1 1 1 3 4 區間1到2就是1,區間1到5就是8。這種線段樹只能離線來寫,離線的方法是按照查詢區間的右端點來排序,然後這道題目的資料範圍較大需要離散化簡單處理一下,然後對於輸入的每個點來說,順序走下去。然後如果當前點之前出...