ZZUOJ 10508 數列遊戲IV

2021-09-26 14:21:33 字數 2350 閱讀 3758

題目鏈結

題目大意:給定乙個序列,長度為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列舉每個位置,按上述方法更新樹狀陣列,然後計算以這個位置為右端點結束的區間的值。

**:

1

const

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 1

1 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號要征服各個...