1. 程式人生 > >Newcoder 16 B.Distance(水~)

Newcoder 16 B.Distance(水~)

Description

F S T FST 作為小朋友,經常會遇到和距離有關的問題,但是他已經厭倦了曼哈頓距離和歐幾里德距離,所以 F S

T FST 就定義了一種 F S T FST 距離。

這種距離並不用於空間或平面中,而運用於 F

S T FST 發明的一些神奇的演算法中(唔… …)。

i i 號元素的特徵值為 A

i A_i ,則 i i j j F S T FST 距離是 i 2 j 2 + A i 2 A j 2 |i^2 - j^2|+|A_i^2 - A_j^2|

為了實現某新的資料結構, F S T FST 想在一大堆元素中找出距離最大的一對元素,他不關心是哪一對元素,只想求出最大距離。

Input

第一行,一個正整數 n n ,為元素個數。

第二行, n n 個正整數 A i A_i 為這 n n 個元素的特徵值。

( n 1 0 5 , A i 1 0 9 ) (n\le 10^5,A_i\le 10^9)

Output

一行,一個正整數表示最大距離。 l o n g   l o n g long\ long 請用 l l d lld

Sample Input

2
4 3

Sample Output

10

Solution

( i 2 , A i 2 ) (i^2,A_i^2) 看作第 i i 個點的二維座標,問題轉化為求 n n 個點中任意兩點之間哈密頓距離最大值,假設 i i 點座標為 ( x i , y i ) (x_i,y_i) ,那麼 x i , y i x_i,y_i 在最優答案中的符號只有四種情況 ( ± x i ± y i ) (\pm x_i\pm y_i) ,而對應的另一點的符號與該點相反,那麼我們列舉這四種符號的可能,把每個點在該種符號下對答案的貢獻排序,最大值即為該種符號的最大貢獻,最小值取負即為另一個點對答案的最大貢獻,兩者加起來維護最優解即為答案,時間複雜度 O ( n l o g n ) O(nlogn)

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;
}