NC:Distance(類曼哈頓和歐幾里德距離)
題目描述
FST 作為小朋友,經常會遇到和距離有關的問題,但是他已經厭倦了曼哈頓距離和歐幾里德距離,所以 FST 就定義了一種 FST 距離。
這種距離並不用於空間或平面中,而運用於 FST 發明的一些神奇的演算法中(唔… …)。
設 i 號元素的特徵值為 A i ,則 i 和 j 的 FST 距離是
D
i
s
t
a
n
c
e
(
F
S
T
)
=
∣
i
2
−
j
2
∣
+
∣
A
i
2
−
A
j
2
∣
Distance(FST) = | i^2 - j^2 | + |A_i^2 - A_j^2|
Distance(FST)=∣i2−j2∣+
為了實現某新的資料結構,FST想在一大堆元素中找出距離最大的一對元素,他不關心是哪一對元素,只想求出最大距離。
NC:Distance
輸入描述:
第一行,一個正整數 n,為元素個數。
第二行,n 個正整數 A i 為這 n 個元素的特徵值。
輸出描述:
一行,一個正整數表示最大距離。long long 請用 lld
題目分析
題解:與曼哈頓距離本質一樣,將其去掉絕對值可有四種情況
i
2
−
j
2
+
A
i
2
−
A
j
2
(
1
)
j
2
−
i
2
+
A
i
2
−
A
j
2
(
2
)
i
2
−
j
2
+
A
j
2
−
A
i
2
(
3
)
j
2
−
i
2
+
A
j
2
−
A
i
2
(
4
)
\begin{array}{l} i^2 - j^2 + A_i^2 - A_j^2&&(1)\\ j^2 - i^2 + A_i^2 - A_j^2&&(2)\\ i^2 - j^2 + A_j^2 - A_i^2&&(3)\\ j^2 - i^2 + A_j^2 - A_i^2&&(4)\\ \end{array}
由(3)合併同類項有:
i
2
−
A
i
2
+
A
j
2
−
j
2
(
5
)
\begin{array}{l} i^2 - A_i^2 + A_j^2 - j^2 && (5) \end{array}
i2−Ai2+Aj2−j2(5)(5)可理解為點 ( i , A i) 和點 ( j , A j ) 與原點的關係 。
而將四種情況的點 ( i , A i) 提取只有兩種情況即:
A
i
2
−
i
2
o
r
A
i
2
+
i
2
A_i^2 - i^2 or A_i^2 + i^2
AC程式碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 100000 + 5;
ll a[maxn],b[maxn];
int main(){
int n;
ll x;
while(scanf("%d",&n)!=EOF){
for(int i = 1; i <= n; i ++){
scanf("%lld",&x);
a[i] = x * x + 1LL * i * i;
b[i] = x * x - 1LL * i * i;
}
sort(a + 1,a + n + 1);
sort(b + 1,b + n + 1);
ll maxx = max(b[n] - b[1],a[n] - a[1]);
printf("%lld\n",maxx);
}
return 0;
}