題目鏈結:
題目大意:給定乙個序列,長度為n,每次詢問為一組區間[li,ri],輸出li到ri**現恰好兩次的不同數的個數. n,m<=2*10^5,序列中元素<=10^9
解題思路:考慮用樹狀陣列解決(大概是一種型別的題目)。樹狀陣列一般用來快速計算更新(logn)字首和,而對於本題來說,出現次數顯然不能單純隨意相加相減,另外,對於右區間靠前的查詢來說,對其查詢之後後面的資料更新是不會再影響到它的,因此可以離線處理,並且需要在更新的時候針對重複元素進行一些處理。
首先考慮乙個元素在序列中不同位置重複出現的情況,如下:
_ x _ x _ x _ x _ x _ (下劃線表示出現了若干與x不相同的數字)
從前到後給每個x編號1,2,3,4,5,下面看一下從前到後掃面到這五個位置時如何更新(其中a,b等字母表示這個位置應當具有的值):
_ x _ x _ x _ x _ x _
1 0
2 a b 那麼應當有 b + a = 1, (b + a) - a = 0, 則 b = 0, a = 1
3 a b c 那麼應當有 c + b + a = 0, (c + b + a) - (b + a) = 0, (c + b + a) - a = 1, 則 c = 0, b = 1, a = -1.
4 a b c d 那麼應當有 d + c + b + a = 0, d + c + b + a - (c + b + a) = 0, (d + c + b + a) - (b + a) = 1
(d + c + b + a) - a = 0, 則 d = 0, c = 1, b = -1, a = 0
即是:_ x _ x _ x _ x _ x _
1 0
2 1 0
3 -1 1 0
4 0 -1 1 0
5 0 0 -1 1 0
然後關係就非常明顯了,我們只需要記錄下每個位置的數字上次出現的位置,然後 lastpos + 1,la_lastpos - 2, la_la_lastpos + 1, 即可。那麼對於任意乙個區間來說,由於其中每個數字都滿足互相加減的條件,因此直接樹狀陣列相加減即可。
大致過程:記錄每個位置對應數字上次出現位置;將查詢的區間按照有端點排序;從1~n列舉每個位置,按上述方法更新樹狀陣列,然後計算以這個位置為右端點結束的區間的值。
**:
1const
int maxn = 2e5 + 10;2
struct
node7};
8node range[maxn];
9int
n, m;
10int
a[maxn], ans[maxn], bit[maxn];
11int
last[maxn];
12 mapmmp;
1314
int lowbit(int
x)17
void add(int x, int
v)22}23
int sum(int
x)29
return
ans;30}
31void
solve()
38 sort(range + 1, range + 1 +m);
39int ind = 1;40
for(int i = 1; i <= n; i++)50}
51while(ind <= m && range[ind].r ==i)56}
57for(int i = 1; i <= m; i++)60}
61int
main()
69solve();
70 }
題目:time limit: 1 sec memory limit: 128 mb
submit: 32 solved: 6
[submit][status][web board]
給定乙個序列,長度為n,每次詢問為一組區間[li,ri],輸出li到ri**現恰好兩次的不同數的個數.
第一行兩個整數n和m,n表示序列長度,m表示詢問次數.(n,m<=2*10^5)
第二行n個整數,表示序列.(序列中元素<=10^9)
以後m行,每行為li和ri,表示詢問區間.(1<=li<=ri<=n)
對於每組詢問,輸出一行乙個整數,表示不相同數的個數.
5 11 2 1 1 1
1 3
1
raywzy
zzuoj 10406 A 挑戰密室
time limit 1 sec memory limit 128 mb submit 5 solved 2 submit status web board r組織的 dr.kong 為了尋找丟失的超體元素,不幸陷入 wto密室。dr.kong 必須盡快找到解鎖密碼逃離,否則幾分鐘之後,wto密室即...
ZZUOJ 10508 樹狀陣列
給定乙個序列,長度為n,每次詢問為一組區間 li,ri 輸出li到ri中出現恰好兩次的不同數的個數.先對a離散化一下,當然也可以不離散化,用map也行。離線做,按右端點排序,從1遍歷到n,更新樹狀陣列和ans 對於a陣列,我們記錄上乙個和a i 相等的位置last i 更新樹狀陣列不太好想,具體看 ...
zzuoj 10400 B 海島爭霸
time limit 2 sec memory limit 128 mb submit 25 solved 12 submit status web board 神秘的海洋,驚險的探險之路,打撈海底寶藏,激烈的海戰,海盜劫富等等。加勒比海盜,你知道吧?傑克船長駕駛著自己的的戰船黑珍珠 1號要征服各個...