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 output2
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...