Newcoder 16 B.Distance(水~)
阿新 • • 發佈:2018-11-04
Description
作為小朋友,經常會遇到和距離有關的問題,但是他已經厭倦了曼哈頓距離和歐幾里德距離,所以 就定義了一種 距離。
這種距離並不用於空間或平面中,而運用於 發明的一些神奇的演算法中(唔… …)。
設 號元素的特徵值為 ,則 和 的 距離是 。
為了實現某新的資料結構, 想在一大堆元素中找出距離最大的一對元素,他不關心是哪一對元素,只想求出最大距離。
Input
第一行,一個正整數 ,為元素個數。
第二行, 個正整數 為這 個元素的特徵值。
Output
一行,一個正整數表示最大距離。 請用
Sample Input
2
4 3
Sample Output
10
Solution
把 看作第 個點的二維座標,問題轉化為求 個點中任意兩點之間哈密頓距離最大值,假設 點座標為 ,那麼 在最優答案中的符號只有四種情況 ,而對應的另一點的符號與該點相反,那麼我們列舉這四種符號的可能,把每個點在該種符號下對答案的貢獻排序,最大值即為該種符號的最大貢獻,最小值取負即為另一個點對答案的最大貢獻,兩者加起來維護最優解即為答案,時間複雜度
Code
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=100001;
ll x[maxn],y[maxn],z[maxn];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
x[i]=1ll*i*i;
scanf("%lld",&y[i]);
y[i]*=y[i];
}
ll ans=0;
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++)
{
int f1=1,f2=1;
if(i)f1=-1;
if(j)f2=-1;
for(int k=1;k<=n;k++)z[k]=x[k]*f1+y[k]*f2;
sort(z+1,z+n+1);
ans=max(ans,z[n]-z[1]);
}
printf("%lld\n",ans);
return 0;
}