problem description
今天h考完了期末考試,他在教學樓裡閒逛,他看著教學樓裡一間間的教室,於是開始思考:
如果從乙個座標為 (x1,y1,z1)的教室走到(x2,y2,z2))的距離為 |x1−x2|+|y1−y2|+|z1−z2|
那麼有多少對教室之間的距離是不超過r的呢?
input
第一行是乙個整數t(1≤t≤10), 表示有t組資料 接下來是t組資料,對於每組資料: 第一行是兩個整數n,q(1≤n≤5×104,1≤q≤103)表示有n間教室, q次詢問. 接下來是n行, 每行3個整數xi,yi,zi(0≤xi,yi,zi≤10)表示這間教室的座標. 最後是q行,每行乙個整數r(0≤r≤109),意思見描述.
output
對於每個詢問r輸出一行乙個整數,表示有多少對教室滿足題目所述的距離關係.
sample input
1
3 3
0 0 0
1 1 1
1 1 1
1 23
sample output
1
13
hint
對於樣例,1號教室和2號教室之間的距離為3, 1號和3號之間的距離為3, 2號和3號之間的距離為0
題意:在乙個三維空間中有n個點,q次查詢,每次查詢給一距離r,求出三維空間中有多少對點之間的哈密頓距離小於r。
思路:一開始的時候如果按最簡單的想法,先兩兩配對求出每兩個點之間的距離,之後輸出,但是本題中點的數目n的資料較大,如果要全部處理的話需要10^9的複雜度,肯定會超時。這個時候我們觀察後發現,每乙個點的範圍很小,0<=x,y,z<=10,如果我們通過座標來遍歷每乙個點,那麼就只需要10^3的複雜度,顯然更合適。所以本題也是如此,通過以座標為單位的列舉,就可以得到最後的結果:
注釋:哈密頓距離定義是:對於二維平面上的兩點a,b,其座標分別為:
#include #include #include #include int n, q, t, tem;
int a, b, c, i, x, y, z;
long long int aa[35];
long long int d[15][15][15];
int dis(int a, int b, int c, int x, int y, int z)
int main()
for(a = 0; a <= 10; a++)}}
}}}}
}//只列舉x,y,z在範圍內,輸入的每兩個點之間的距離
for(i = 1; i <= 30; i++)
aa[i] /= 2;
for(i = 1; i <= 30; i++)
aa[i] += aa[i-1];
while(q--)
}return 0;
}
玲瓏杯1143 計算幾何你瞎暴力
1143 計算幾何你瞎暴力 time limit 5s memory limit 256mbyte submissions 1735solved 341 description 今天 hhhh考完了期末考試,他在教學樓裡閒逛,他看著教學樓裡一間間的教室,於是開始思考 如果從乙個座標為 x 1,y1 ...
玲瓏oj1143 計算幾何你瞎暴力
1143 計算幾何你瞎暴力 time limit 5s memory limit 256mbyte submissions 1786solved 354 description 今天 hhhh考完了期末考試,他在教學樓裡閒逛,他看著教學樓裡一間間的教室,於是開始思考 如果從乙個座標為 x 1,y1 ...
loj517 計算幾何瞎暴力
在序列上維護4個操作 1.在序列的尾端新增x 2.輸出al ar的和 3.將所有數異或x 4.將序列從小到大排序 第一眼看上去是splay於是頭鐵硬剛了一發 後來發現splay沒法異或 然後看到了trie樹 學習了乙個 1.直接插到序列裡 2.考慮字首和 因為trie樹所管轄的下標區間是有序的,所以...