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