题目链接:https://www.nowcoder.com/acm/contest/16/B
FST作为小朋友,经常会遇到和距离有关的问题,但是他已经厌倦了曼哈顿距离和欧几里德距离,所以FST就定义了一种FST距离。
这种距离并不用于空间或平面中,而运用于FST发明的一些神奇的算法中(唔... ...)。
设i号元素的特征值为A i,则i和j的FST距离是 |i 2 - j 2|+|A i 2 - A j 2|。
为了实现某新的数据结构,FST想在一大堆元素中找出距离最大的一对元素,他不关心是哪一对元素,只想求出最大距离。
这种距离并不用于空间或平面中,而运用于FST发明的一些神奇的算法中(唔... ...)。
设i号元素的特征值为A i,则i和j的FST距离是 |i 2 - j 2|+|A i 2 - A j 2|。
为了实现某新的数据结构,FST想在一大堆元素中找出距离最大的一对元素,他不关心是哪一对元素,只想求出最大距离。
输入描述:
第一行,一个正整数n,为元素个数。 第二行,n个正整数Ai为这n个元素的特征值。
输出描述:
一行,一个正整数表示最大距离。long long请用lld
示例1
输入
2 4 3
输出
10
备注:
n≤105,Ai≤109
分别按这四种情况排序然后找出这四种情况里的最大值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node{
ll I,A;
};
node a[100010];
int cmp1(node x,node y){
return x.I*x.I+x.A*x.A>y.I*y.I+y.A*y.A;
}
int cmp2(node x,node y){
return x.I*x.I+y.A*y.A>y.I*y.I+x.A*x.A;
}
int cmp3(node x,node y){
return y.I*y.I+x.A*x.A>x.I*x.I+y.A*y.A;
}
int cmp4(node x,node y){
return y.I*y.I+y.A*y.A>x.I*x.I+x.A*x.A;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i].A);
a[i].I=i;
}
ll maxx=0;
sort(a+1,a+n+1,cmp1);
if(abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A)>maxx)
maxx=abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A);
sort(a+1,a+n+1,cmp2);
if(abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A)>maxx)
maxx=abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A);
sort(a+1,a+n+1,cmp3);
if(abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A)>maxx)
maxx=abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A);
sort(a+1,a+n+1,cmp4);
if(abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A)>maxx)
maxx=abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A);
printf("%lld\n",maxx);
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node{
ll I,A;
};
node a[100010];
int cmp1(node x,node y){
return x.I*x.I+x.A*x.A>y.I*y.I+y.A*y.A;
}
int cmp2(node x,node y){
return x.I*x.I+y.A*y.A>y.I*y.I+x.A*x.A;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i].A);
a[i].I=i;
}
ll maxx=0;
sort(a+1,a+n+1,cmp1);
if(abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A)>maxx)
maxx=abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A);
sort(a+1,a+n+1,cmp2);
if(abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A)>maxx)
maxx=abs(a[1].I*a[1].I-a[n].I*a[n].I)+abs(a[1].A*a[1].A-a[n].A*a[n].A);
printf("%lld\n",maxx);
return 0;
}