我們在用二維樹狀陣列的時候,可以得到乙個邊與座標軸平行的矩形內點集的資訊。
如果我們需要得到得到到乙個點的距離小於等於k的點的資訊呢。這些點構成的不在是邊也座標軸平行的矩形,而是乙個對角線與座標軸平行的菱形。
可以通過轉化,使得整個座標軸旋轉45°,然後我們菱形變成了方方正正的矩形,又可以用而二維樹狀陣列或者直接用字首和來得到矩形區間資訊。
旋轉後區域邊長*√2,面積*2,原本的距離<=k的區域,現在變成了[x』-k,y』-k]到[x』+k,y』+k]的矩形區域。我們假設順時針旋轉45°。
怎麼轉化呢?為了避免用公式的時候出錯,我們一豎一豎的旋**
對於每一豎,我們得到(x,0)對應的(x,n-x+1),然後向上乙個個移動,等效於向右上乙個乙個移動。
則有:
for(int i=1;i<=n;i++)注意, 為了避免k太大,而超出邊界,而邊界外的點沒有可用資訊,我們需要判斷一下邊界。
void stardard(int &x)所以想要得到資訊的時候,也同樣轉化座標:
int x1=x,y1=n-x+1那麼根本不用記公式(雖然公式不難)。切比雪夫轉曼哈頓的話,也只需要乙個乙個轉就行了。不好處理邊界的話,可以每個點的橫縱座標都加乙個值,防止越界。; x1+=y-1;y1+=y-1
;int
ans+=getsum(i,x1-k,y1-k,x1+k,y1+k);
(裡面記住縮小邊界)
感覺還是比較常用的,所以例題就不說了。
1012 曼哈頓距離 切比雪夫距離
什麼是切比雪夫距離?什麼是曼哈頓距離?傻傻分不清,沒關係,看 曼哈頓距離設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis x1 x2 y1 y2 即兩點橫縱座標差之和 切比雪夫距離 設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis max x1 x2 y1 y...
曼哈頓距離和切比雪夫距離轉化
曼哈頓距離和切比雪夫距離 兩個點的距離定義為點 x,y 和它周圍的 8 個點 x 1,y x 1,y x,y 1 x,y 1 x 1,y 1 x 1,y 1 x 1,y 1 x 1,y 1 距離為 1 用下 gyx 學長的圖 切比雪夫距離 dis max delta x,delta y delta ...
松鼠搬家 切比雪夫距離 到 曼哈頓距離
題意 求切比雪夫距離 直接求不好求,可以轉化成曼哈頓距離 切比雪夫 d max x 1 x 2 y 1 y 2 曼哈頓距離 d x 1 x 2 y 1 y 2 d max x 1 x 2 y 1 y 2,x 1 x 2 y 2 y 1,x 2 x 1 y 1 y 2,x 2 x 1 y 2 y 1 ...