傳送門: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的組(實際操作很簡單,沒有我說的複雜。。。)。 對於每個詢問就在這logn \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 log2n )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年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...