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

2021-09-02 22:15:35 字數 2248 閱讀 2606

傳送門: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

numnu

m位,則將操作分成按n

nn的二進位制來劃分:對於任意0≤i

m0\leq i0≤

im若n&2

i=2i

n\&=2^i

n&2i=2

i,則劃分出乙個大小為2

i2^i

2i的組(實際操作很簡單,沒有我說的複雜。。。)。

對於每個詢問就在這log⁡n

\log n

logn

個組中依次查詢。主席樹替代了二維線段樹的功能,rtrt

rt這一維維護遞增的x

xx座標,樹內維護遞增的值域範圍內的y

yy座標。所以每次二分找出x

xx座標對應的樹範圍,查詢區間[y−

k,y+

k]

[y-k,y+k]

[y−k,y

+k]的總值即可。

對於每個新增的操作,強行劃分出乙個大小為1的組後不斷向前合併即可。

複雜度o(n

log⁡2n

)o(n\log^2n)

o(nlog2n

)。需要建記憶體池動態維護線段樹的點標號。

#include

#define mid ((l+r)>>1)

#define lc ls[k],l,mid

#define rc rs[k],mid+1,r

#define pb push_back

using

namespace std;

const

int n=

6e4+

10,m=

1e5+

10,mx=

16e4

,nx=

1e7+5;

int n,m,cnt,a[n]

,rt[20]

[m],num,top;

int ss[nx]

,ls[nx]

,rs[nx]

;char op[10]

;bool vs[nx]

;struct pl

inline

void

psh(

int x)

}pl;

struct pr

;bool

operator

<

(const pr&ky)

const

bool

operator==(

const pr&ky)

const

}rep[m]

;vectorv[20]

;void

ins(

int pre,

int&k,

int l,

int r,

int pos)

}voiddl(

int k,

int l,

int r)

inline

void

ins(

int x,

int y)

else

} v[num--].

clear()

;v[num]

.clear()

;for

(i=0

;i++i) v[num].pb

(rep[i]);

}}intask

(int pre,

int k,

int l,

int r,

int l,

int r)

inline

intquery

(int x,

int y,

int vv)

printf

("%d\n"

,re);}

intmain()

for(

;m;--m)

return0;

}

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

傳送門 二進位制分組入門題。主席樹寫錯調題2h 2h 2h 體驗極差。題意簡述 給一堆點,支援加入乙個點,詢問有多少個點跟 x,y x,y x,y 曼哈頓距離不超過kkk。思路 題目要求的是對於乙個斜著的正方形的查詢。我們考慮轉切比雪夫距離轉成正常的正方形。然後就變成了乙個動態的二維數點問題。這個時...

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年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...