其實就是旋轉座標系,先旋轉再伸縮
一般曼哈頓距離直接做不好做的,可以轉成切比雪夫距離試試看
將乙個點(x,y)的座標變為
將乙個點(x,y)的座標變為
第二個顯然是第乙個的逆變換,所以記第乙個就好
①洛谷p3964 [tjoi2013]松鼠聚會
松鼠聚會
n<=1e5個點,點i座標(xi,yi)(-1e9<=xi,yi<=1e9),
求n個點中的一點使得其餘點到這一點切比雪夫距離和最小,輸出距離和
先轉曼哈頓距離,計i,j曼哈頓距離為
將x按增序排列,最後肯定是求
等價於具體實現時,先按((x+y)/2,(x-y)/2)轉曼哈頓座標,確保整數座標*2,最後將距離/2即可
#includeusing namespace std;
typedef long long ll;
const int n=1e5+10;
ll sx[n],sy[n],ans,tmp;
int n,x[n],y[n],idx,idy;
struct node
e[n];
int main()
sort(x+1,x+n+1);
sort(y+1,y+n+1);
for(int i=1;i<=n;++i)
ans=8e18;
for(int i=1;i<=n;++i)
printf("%lld\n",ans/2);
return 0;
}
②牛客挑戰賽34
拉普蘭德的願望
n(n<=1e5)個點,點的範圍(x,y)的絕對值在l(l<=5e4)內,
求有多少點對的曼哈頓距離不小於d(d<=1e7)
用總的點對減去小於d的點對,把曼哈頓距離轉化為切比雪夫距離
等價於判切比雪夫距離為d的正方形以內(不含矩形輪廓線)的點對有多少個
考慮到用每個正方形的左半部分去取點,這樣每個點對只會記錄一次,(左,右)
二維偏序問題,x排增序,按y值插入到bit上,詢問[y-d+1,y+d-1]的和,
x的距離每超過d時,就從bit裡把之前插的點刪去
#includeusing namespace std;
typedef long long ll;
const int n=1e5+10;
int n,d,l,a,b,tr[n*2];
ll ans;
struct node
e[n];
bool operator
int main()
sort(e+1,e+n+1);
ans=1ll*n*(n-1)/2;
for(int i=1,now=1;i<=n;++i)
ans=(ans-(sum(min(4*l,e[i].y+d-1))-sum(max(0,e[i].y-d))));//[y-d+1,y+d-1]
add(e[i].y,1);
} printf("%lld\n",ans);
return 0;
}
③四川大學第二屆scuacm新生賽(同步賽)
撿金幣
t(t<=100)組樣例,每次給出n*m(n,m<=1e3)的棋盤,每個格仔放入的金幣數v(1<=v<=1e6),
q(q<=1e5)組詢問,每次給出(x,y)和距離k,詢問到(x,y)曼哈頓距離小於等於k的金幣數之和
其實感覺t=100時時間1s有點極限,先轉切比雪夫距離到2e3*2e3的陣列,
二維字首和預處理,對於詢問o(1)回答即可
#includeusing namespace std;
typedef long long ll;
const int n=2010;
int t,n,m,q,mp[n][n];
int a,c,b,d,x,y,k,v;
ll sum[n][n];
ll cal(int a,int c,int b,int d)
int main()
for(int i=1;i<=n;++i)
}for(int i=1;i<=n+m;++i)
}for(scanf("%d",&q);q;q--)
}return 0;}/*
3 41 2 3 4
5 6 7 8
9 10 11 12
42 2 0
2 2 1
2 2 2
2 2 3
*/
④統計曼哈頓距離內掃瞄線可以轉成矩形的掃瞄線 1012 曼哈頓距離 切比雪夫距離
什麼是切比雪夫距離?什麼是曼哈頓距離?傻傻分不清,沒關係,看 曼哈頓距離設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis x1 x2 y1 y2 即兩點橫縱座標差之和 切比雪夫距離 設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis max x1 x2 y1 y...
總結 曼哈頓距離轉切比雪夫距離
我們在用二維樹狀陣列的時候,可以得到乙個邊與座標軸平行的矩形內點集的資訊。如果我們需要得到得到到乙個點的距離小於等於k的點的資訊呢。這些點構成的不在是邊也座標軸平行的矩形,而是乙個對角線與座標軸平行的菱形。可以通過轉化,使得整個座標軸旋轉45 然後我們菱形變成了方方正正的矩形,又可以用而二維樹狀陣列...
曼哈頓距離和切比雪夫距離轉化
曼哈頓距離和切比雪夫距離 兩個點的距離定義為點 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 ...