bzoj4170 極光(CDQ分治)

2021-08-20 15:58:51 字數 3315 閱讀 2067

time limit: 30 sec

memory limit: 512 mb

「若是萬一琪露諾(俗稱rhl)進行攻擊,什麼都好,冷靜地回答她的問題來吸引她。對方表現出興趣的話,那就慢

慢地反問。在她考慮答案的時候,趁機逃吧。就算是很簡單的問題,她一定也答不上來。」

–《上古之魔書》

天空中出現了許多的北極光,這些北極光組成了乙個長度為

n n

的正整數數列a[i],遠古之魔書上記載到:2個位置的gr

aze' role="presentation" style="position: relative;">gra

zegr

aze值為兩者位置差與數值差的和: gr

aze(

x,y)

=|x−

y|+|

a[x]

−a[y

]|g ra

ze(x

,y)=

|x−y

|+|a

[x]−

a[y]

|。

要想破解天罰,就必須支援2種操作(

k k

都是正整數): mo

dify

x k' role="presentation" style="position: relative;">mod

ifyx

kmod

ifyx

k:將第

x x

個數的值修改為

k' role="presentation" style="position: relative;">kk。

quer

yxk que

ryxk

:詢問有幾個

i i

滿足gr

aze(

x,i)

<=

k' role="presentation" style="position: relative;">gra

ze(x

,i)<=kg

raze

(x,i

)<=k。

由於從前的天罰被聖王lmc破解了,所以rhl改進了她的法術,詢問不僅要考慮當前數列,還要考慮任意歷史版本,即統計任意位置上出現過的任意數值與當前的a[

x]a [x

]的gr

aze gra

ze

值<=

k k

的對數。(某位置多次修改為同樣的數值,按多次統計)

第1行兩個整數

n' role="presentation" style="position: relative;">nn,

q q

。分別表示數列長度和運算元。

第2行n

' role="presentation" style="position: relative;">n

n個正整數,代表初始數列。

第3~q+2

q +2

行每行乙個操作。 n≤

40000

n

≤40000

, 修改運算元

≤60000

60000

, 詢問運算元

≤10000

10000

, ma

xa[i

] max

a[i]

(含修改)

≤80000

80000

對於每次詢問操作,輸出乙個非負整數表示答案

sample input

3 5

2 4 3

query 2 2

modify 1 3

query 2 2

modify 1 2

query 1 1

sample output
2

33

' role="presentation" style="position: relative;">

' role="presentation" style="position: relative;">

' role="presentation" style="position: relative;">

' role="presentation" style="position: relative;">

其實題面本來可以寫得清楚易懂,不知道出題人的語文是怎麼學的。其實就是加數,把時間、數軸、陣列分別看做一維,可以發現要求的兩維是乙個切比雪夫距離。就是求乙個菱形裡的點數。當然可以使用kdtree。但是自然菱形是非常不好操作的,我們考慮把它轉化成矩形,是不是就很好做了?

具體做法可以參見這個部落格。

簡單來說就是(x

+y2,

x−y2

)' role="presentation" style="position: relative;">(x+

y2,x

−y2)

(x+y

2,x−

y2)剩下的就大同小異了。

值得學習的就是曼哈頓距離和切比雪夫距離的相互轉化。

#include

#include

#include

#include

#define lowbit(x) (x&(-x))

using namespace std;

bool key;

struct lxy

}int query(int

x) return ret;

}void cdq(int l,int r)

int mid=(l+r)>>1;

cdq(l,mid);cdq(mid+1,r);

key=0;sort(q+l,q+r+1);

for(int i=l;i<=r;i++)

for(int i=l;i<=r;i++)

if(q[i].type==0&&q[i].tim<=mid)

modify(q[i].y,-1);

}int main()

for(int i=1;i<=m;++i)

data[x]=y;

q[cnt].x=x-y+p;

q[cnt].y=x+y+p;

}cdq(1,cnt);

key=1;sort(q+1,q+1+cnt);

for(int i=1;i<=cnt;i++)

if(q[i].type==2)

printf("%d\n",q[i+1].ans-q[i].ans);

}

BZOJ1173 CDQ分治 筆記

目錄一類特殊的cdq分治 附 bzoj mokia ac 偏序關係 link1 資料結構 link1,高階指南p212 雜燴 link1 hdu1892 一維樹狀陣列 二進位制分段思想 可以把 m 2 a 2 b cdots a b cdots 分解成 0,2 a 2 a 2 a 2 b m 2 z...

BZOJ 2253 紙箱堆疊(CDQ分治)

description p 工廠是乙個生產紙箱的工廠。紙箱生產線在人工輸入三個引數 n p a 之後,即可自動化生產三邊邊長為 a mod p,a 2 mod p,a 3 mod p a 4 mod p,a 5 mod p,a 6 mod p a 3n 2 mod p,a 3n 1 mod p,a ...

BZOJ3262 陌上花開 CDQ分治

對第一關鍵字排序,分治每朵花,合併的時候通過歸併左右的花的第二關鍵字,將值插入樹狀陣列中求值。對於相同的花,先進行預處理即可。include bits stdc h define lowbit x x x using namespace std const int n 100005,m 200005...