牛客 Distance

Distance
链接:https://ac.nowcoder.com/acm/problem/14268
来源:牛客网

FST作为小朋友,经常会遇到和距离有关的问题,但是他已经厌倦了曼哈顿距离和欧几里德距离,所以FST就定义了一种FST距离。
这种距离并不用于空间或平面中,而运用于FST发明的一些神奇的算法中(唔… …)。
设i号元素的特征值为Ai,则i和j的FST距离是

|i2 - j2|+|Ai 2 - Aj2|。

为了实现某新的数据结构,FST想在一大堆元素中找出距离最大的一对元素,他不关心是哪一对元素,只想求出最大距离。

输入
2
4 3
输出
10

对于绝对值的情况进行分类讨论即可,有4种情况,但由于对称性,最后其实是两种情况

1.i2+Ai2-(j2+Aj2)
2.i2-Ai2-(j2-Aj2)

这样就可以表示归纳成为两类数据,一为i2+Ai2,二为i2-Ai2
就可以O(n)了。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
ll a[100005]; 
int main(){
	#ifdef LOCAL
	freopen(".\\a.in", "r", stdin);
	#endif
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	ll maxx1=0,minn1=99999999999999999;
	ll maxx2=-99999999999999,minn2=99999999999999999;
	for(ll i=1;i<=n;i++){
		if(i*i+a[i]*a[i]>maxx1)maxx1=i*i+a[i]*a[i];//类别1的最大值
		if(i*i+a[i]*a[i]<minn1)minn1=i*i+a[i]*a[i];//类别1的最小值
		if(i*i-a[i]*a[i]>maxx2)maxx2=i*i-a[i]*a[i];//类别2的最大值
		if(i*i-a[i]*a[i]<minn2)minn2=i*i-a[i]*a[i];//类别2的最小值
	}
	ll ans1,ans2;
	ans1=maxx1-minn1;
	ans2=maxx2-minn2;
	printf("%lld\n",max(ans1,ans2));
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值