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

2021-09-29 07:31:19 字數 2775 閱讀 3791

【描述】

給定乙個長度為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。因為可持久化資料結構的流行,詢問不僅要考慮當前數列,還要

考慮任意歷史版本,即統計任意位置上出現過的任意數值與當前的a[x]的graze值<=k的對數。(某位置多次修改為 同樣的數值,按多次統計)

由於我們要考慮任意歷史版本,所以題意實際上是:

1.加入乙個點(pos,val)

2.詢問graze(x,i)<=k的點數

經過簡單座標變換,問題變成:

1.加入乙個點(val+pos,val-pos)

2.詢問座標平面乙個矩形裡點的數量(n

log2

n)

o(nlog^2n)

o(nlog

2n),空間複雜度o(n

logn

)o(nlogn)

o(nlog

n)。注意**空間,否則空間複雜度會降為o(n

log2

n)

o(nlog^2n)

o(nlog

2n)。

二進位制分組複雜度分析

對於每個修改,我們發現合併複雜度與當且修改個數的lowbit有關。設f(x

)=xl

og2x

f(x)=xlog_2x

f(x)=x

log2

​x,那麼時間複雜度就是:

∑ i=

1nf(

lowb

it(i

))

\sum_^n f(lowbit(i))

i=1∑n​

f(lo

wbit

(i))

對於每個lowbit分別考慮有多少個數的lowbit是它:

∑ i=

1log

2nf(

2i)∗

n2i+

1\sum_^f(2^i)*\frac}

i=1∑lo

g2​n

​f(2

i)∗2

i+1n

​即:∑ i=

1log

2n2i

∗i∗n

2i+1

\sum_^2^i*i*\frac}

i=1∑lo

g2​n

​2i∗

i∗2i

+1n​

上式小於:

∑ i=

1log

2nlo

g2n∗

n2

\sum_^log_2n*\frac

i=1∑lo

g2​n

​log

2​n∗

2n​所以合併時間複雜度上界就是o(n

log2

n)

o(nlog^2n)

o(nlog

2n)。查詢需要在log個資料結構裡花費log的代價,所以詢問的時間複雜度也是o(n

log2

n)

o(nlog^2n)

o(nlog

2n)。

**:

#include

#define re register

#define mp make_pair

using

namespace std;

const

int n=

2e5+

5,lim=

2e5,m=

1e5;

inline

intred()

typedef pair<

int,

int>t;

int n,m,a[n]

,b,c;

int rt[19]

[n],ch[n*40|

1][2

],s[n*30|

1],top=

0,siz[n*40|

1],num=

0,tot=0;

vectorv[19]

;bool vis[n*40|

1];inline

intnode

(int p=0)

void

del(

int p)

intchange

(int p,

int l,

int r,

int pos)

intquery

(int u,

int v,

int l,

int r,

int ql,

int qr)

void

rebuild

(int p)

void

insert

(int x,

int y)

v[++num]

=t;rebuild

(num);}

intquery

(int x,

int y,

int len)

return ans;

}char ss[9]

;int

main()

case

'q':}}

}

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 數列(二進位制分組 主席樹)

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

二進位制分組擴充套件

最近才發現的乙個套路,以前以為二進位制分組只能搞揹包,結果發現還有一些更為優秀的操作。我們對於乙個不支援動態操作的資料結構,拆分為 log 個,然後每次加入元素加入到乙個新的組中,如果最新的兩個資料結構元素個數相等,就合併兩個元素。然後暴力重構這個合併得到的資料結構。然後查詢的時候就查詢每乙個分組內...