bzoj2989 數列(二進位制分組 主席樹)

2021-09-10 02:49:48 字數 2020 閱讀 7483

傳送門

二進位制分組入門題。

主席樹寫錯調題2h+

2h+2h

+體驗極差。

題意簡述:給一堆點,支援加入乙個點,詢問有多少個點跟(x,

y)

(x,y)

(x,y

)曼哈頓距離不超過kkk。

思路:題目要求的是對於乙個斜著的正方形的查詢。

我們考慮轉切比雪夫距離轉成正常的正方形。

然後就變成了乙個動態的二維數點問題。

這個時候已經可以上cdq

cdqcd

q =16

+2+1

19=16+2+1

19=16+

2+1個修改操作可以把它拆成第1

11 ~ 16

1616

個修改操作,第17

1717

~18

1818

個修改操作,第19

1919

個修改操作這三組,每個組分別維護自己的答案,詢問就從各個組分別詢問之後把答案累加起來。

然後如果現在又來了第20

2020

個操作,就需要把最後兩個合併成一組,變成20=16

+2+2

20=16+2+2

20=16+

2+2,接著發現最後兩個組都是2

22,又需要把最後兩個合併成一組,變成20=16

+4

20=16+4

20=16+

4。即我們模擬二進位制數的進製來對修改操作進行組與組之間的合併

可以發現這樣的時間複雜度是o(n

logn

2)

o(nlog_n^2)

o(nlog

n2​)

的,足以通過所有測試點。

最後提一下合併時候的處理方法:我們暴力刪除最後乙個組,然後重構倒數第二個組

**:

#include

#define ri register int

#define fi first

#define se second

using

namespace std;

inline

intread()

const

int n=

2e5+

5,k=

1e7+

5,lim=

2e5,maxn=

100000

;int n,m,a[n]

,rt[20]

[n],tp=0;

struct segement_tree

inline

intnewnode()

inline

void

insert

(int

&p,int o,

int l,

int r,

int k)

inline

intquery

(int pl,

int pr,

int l,

int r,

int ql,

int qr)

inline

void

delet

(int

&p)}t;

typedef pair<

int,

int> pii;

vectorv[20]

;inline

void

update

(int x,

int y)

v[tp-1]

=tmp,v[tp]

.clear()

,--tp;}}

inline

intquery

(int x,

int y,

int k)

return ret;

}int

main()

return0;

}

BZOJ 2989 數列 二進位制分組 主席樹

傳送門 bzoj2989 二進位制分組 ca 歐幾里得距離轉成曼哈頓距離 x,y x y,x y x,y x y,x y x,y x y x y 之後問題就變成了每次給乙個點 1,詢問某個矩形範圍內的總值。通常方法是cdq cdqcd q具體來說,設現有總算子為n nn,n nn轉成2進製後有num...

bzoj2989 二進位制分組 主席樹 數列

描述 給定乙個長度為n的正整數數列a i 定義2個位置的graze值為兩者位置差與數值差的和,即graze x,y x y a x a y 2種操作 k都是正整數 1.modify x k 將第x個數的值修改為k。2.query x k 詢問有幾個i滿足graze x,i k。因為可持久化資料結構的...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...