Newcoder 16 B.Distance(水~)

Description

FSTFST作爲小朋友,經常會遇到和距離有關的問題,但是他已經厭倦了曼哈頓距離和歐幾里德距離,所以FSTFST就定義了一種FSTFST距離。

這種距離並不用於空間或平面中,而運用於FSTFST發明的一些神奇的算法中(唔… …)。

ii號元素的特徵值爲AiA_i,則iijjFSTFST距離是 i2j2+Ai2Aj2|i^2 - j^2|+|A_i^2 - A_j^2|

爲了實現某新的數據結構,FSTFST想在一大堆元素中找出距離最大的一對元素,他不關心是哪一對元素,只想求出最大距離。

Input

第一行,一個正整數nn,爲元素個數。

第二行,nn個正整數AiA_i爲這nn個元素的特徵值。

(n105,Ai109)(n\le 10^5,A_i\le 10^9)

Output

一行,一個正整數表示最大距離。long longlong\ long請用lldlld

Sample Input

2
4 3

Sample Output

10

Solution

(i2,Ai2)(i^2,A_i^2)看作第ii個點的二維座標,問題轉化爲求nn個點中任意兩點之間哈密頓距離最大值,假設ii點座標爲(xi,yi)(x_i,y_i),那麼xi,yix_i,y_i在最優答案中的符號只有四種情況(±xi±yi)(\pm x_i\pm y_i),而對應的另一點的符號與該點相反,那麼我們枚舉這四種符號的可能,把每個點在該種符號下對答案的貢獻排序,最大值即爲該種符號的最大貢獻,最小值取負即爲另一個點對答案的最大貢獻,兩者加起來維護最優解即爲答案,時間複雜度O(nlogn)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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章