首页 > 试题广场 >

最大 FST 距离

[编程题]最大 FST 距离
  • 热度指数:8089 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
\hspace{15pt}给定 n 个元素,第 i 个元素具有特征值 A_i。定义FST 距离如下:

\mathrm{dist}(i,j)=\lvert i^2-j^2\rvert+\lvert A_i^2-A_j^2\rvert

\hspace{15pt}请计算 A_i 中所有元素对儿中的最大 FST 距离。

输入描述:
\hspace{15pt}第一行输入一个整数 n\left(1\leqq n\leqq 10^5\right)
\hspace{15pt}第二行输入 n 个整数 A_1,A_2,\dots,A_n\left(1\leqq A_i\leqq 10^9\right)


输出描述:
\hspace{15pt}输出一个整数,表示最大距离。
示例1

输入

2
4 3

输出

10

说明

|4^2-3^2|+|2^2-1^2| = 7+3 = 10

备注:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    long long n;cin>>n;
    vector<long long> x;
    vector<long long> y;
    for(long long i=1;i<=n;i++){
        long long a;cin>>a;
        x.push_back(i*i+a*a);
        y.push_back(a*a-i*i);   
    }
    sort(x.begin(),x.end());
    sort(y.begin(),y.end());
    long long n1=x[n-1]-x[0],n2=y[n-1]-y[0];
    cout<<max(n1,n2);
}

发表于 2026-03-04 17:56:33 回复(0)
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();  // 消耗掉换行符
        String[] parts = sc.nextLine().split(" ");
        long[] A = new long[n];
        for (int i = 0; i < n; i++) {
            A[i] = Long.parseLong(parts[i]);
        }

        // 计算x = i² + A_i²的最大最小值
        long maxX = Long.MIN_VALUE;
        long minX = Long.MAX_VALUE;
        // 计算y = i² - A_i²的最大最小值
        long maxY = Long.MIN_VALUE;
        long minY = Long.MAX_VALUE;

        for (int i = 0; i < n; i++) {
            // 注意索引是从1开始的
            long index = i + 1;
            long indexSq = index * index;
            long aSq = A[i] * A[i];

            long x = indexSq + aSq;
            long y = indexSq - aSq;

            maxX = Math.max(maxX, x);
            minX = Math.min(minX, x);
            maxY = Math.max(maxY, y);
            minY = Math.min(minY, y);
        }

        // 最大距离是两个差值中的较大者
        long maxDist = Math.max(maxX - minX, maxY - minY);
        System.out.println(maxDist);
    }
}

发表于 2025-09-02 11:43:46 回复(0)
n=int(input())
a=list(map(int,input().split()))
b1=sorted([(i+1)**2+a[i]**2 for i in range(len(a))])
b2=sorted([(i+1)**2-a[i]**2 for i in range(len(a))])
c1=b1[-1]-b1[0]
c2=b2[-1]-b2[0]
print(c1) if c1>c2 else print(c2)
发表于 2026-04-16 22:06:49 回复(0)
题目还有儿化音呢
发表于 2026-04-06 16:29:00 回复(0)
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

bool compare(pair<long long, long long> p1, pair<long long, long long> p2) {
    return p1.first > p2.first;
}

int main() {
    long long n; cin >> n;
    vector<pair<long long, long long>> v1, v2;
    for (long long i=1; i<=n; i++) {
        long long num; cin >> num;
        v1.push_back({i*i + num*num, i});
        v2.push_back({i*i - num*num, i});
    }
    sort(v1.begin(), v1.end(), compare);
    sort(v2.begin(), v2.end(), compare);
    long long FST = 0;
    FST = max(v2[0].first - v2[n-1].first, v1[0].first - v1[n-1].first);
    cout << FST << endl;
}
// 64 位输出请用 printf("%lld")

发表于 2026-02-24 21:54:36 回复(0)
# 方法一:暴力解法,但超时
n = int(input())
num_list = list(map(int, input().split()))

max_FST = 0
for i in range(n):    # 任意两点循环计算,将最大值通过max()选出
    for j in range(n):
        max_FST = max(max_FST, abs((i+1)**2-(j+1)**2)+abs(num_list[i]**2-num_list[j]**2))

print(max_FST)

# 方法二:设i^2为Xi,设Ai^2为Yi,则原式可化为dist=|(Xi-Xj)|+|(Yi-Yj)|
# 若(Xi, Yi)是坐标点,则我们要求两点的横纵坐标之差的绝对值的和
# 将绝对值展开得到四个式子
# 1:(Xi±Yi)-(Xj±Yj)  
# 2:(-Xi±Yi)-(-Xj±Yj)    观察可知,第二组式子可由第一组式子的基础上添加负号得来
# 故选择第一组式子,1:(Xi+Yi)-(Xj+Yj)    2:(Xi-Yi)-(Xj-Yj)
# 而上述两个式子中只出现了两种元素:Xi+Yi和Xi-Yi
# 故只需求出两者各自的max和min,相减取最大值即可
n = int(input())
num_list = list(map(int, input().split()))

jia_list = []
jian_list = []
for i in range(n):    # 存入x+y和x-y的所有值
    x = (i + 1) ** 2
    y = num_list[i] ** 2
    jia_list.append(x + y)
    jian_list.append(x - y)

# 根据两个式子计算一个最大的
max_FST = max(max(jia_list) - min(jia_list), max(jian_list) - min(jian_list))
print(max_FST)
发表于 2026-02-15 18:21:08 回复(0)
#include <iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<cmath>
#define ll long long
//      |i^2-j^2|+|Ai^2-Aj^2|  进行去绝对值 并将i,j移到一边 得到4种情况:
//      (i^2+Ai^2)-(j^2+Aj^2)    1
//       -(i^2+Ai^2)+(j^2+Aj^2)    2
//      (i^2-Ai^2)-(j^2-Aj^2)    3             
//      -(i^2-Ai^2)+(j^2-Aj^2)    4
//      
//       令:K1=n^2+An^2;   上面1-2式子得到最大值都是:最大K1减最小K1
//       令:K2=n^2-An^2;   上面3-4式子得到最大值都是:最大K2减最小K2    
int main() {
   vector<ll>v;
   vector<ll>v_k1;
   vector<ll>v_k2;
   ll n;
   cin>>n;
   for(ll i=0;i<n;i++){
      ll a;
      cin>>a;
      v.push_back(a);
   }
   for(ll i=0;i<n;i++){
      ll k1,k2;
      k1=(i+1)*(i+1)+v[i]*v[i];
      v_k1.push_back(k1);
      k2=(i+1)*(i+1)-v[i]*v[i];
      v_k2.push_back(k2);
   }
   sort(v_k1.begin(),v_k1.end());
   sort(v_k2.begin(),v_k2.end());
   ll FSTmax=0;
   FSTmax=max(v_k1[n-1]-v_k1[0],v_k2[n-1]-v_k2[0]);
   cout<<FSTmax;
  
   
}

发表于 2026-01-21 16:24:54 回复(0)
写Javascript的小伙伴记得开BigInt
发表于 2025-11-08 23:03:34 回复(0)
n = int(input())
A = list(map(int,input().split()))

dic_plus = {}
dic_minus = {}
for i in range(n):
    dic_plus[i+1] = A[i]**2+(i+1)**2
    dic_minus[i+1] = A[i]**2-(i+1)**2
sorted_dic_plus_keys = sorted(dic_plus.keys(),key=lambda x:dic_plus[x])
sorted_dic_minus_keys = sorted(dic_minus.keys(),key=lambda x:dic_minus[x])
answer = max(abs(sorted_dic_plus_keys[-1]**2-sorted_dic_plus_keys[0]**2)+abs(A[sorted_dic_plus_keys[-1]-1]**2-A[sorted_dic_plus_keys[0]-1]**2),abs(sorted_dic_minus_keys[-1]**2-sorted_dic_minus_keys[0]**2)+abs(A[sorted_dic_minus_keys[-1]-1]**2-A[sorted_dic_minus_keys[0]-1]**2))

print(answer)
发表于 2025-08-27 00:05:28 回复(0)
//本题做法:|i^2-j^2|+|ai^2-aj^2|存在2个变量(因为ai,aj可以用下标i,j表示出来)
//但是ij之间没有必然联系,我们要试着化简把i,ai放在一起j,aj一起
//|i^2-j^2|+|ai^2-aj^2|,分类讨论可以得到4种情况
//1:|i^2-j^2|>=0且|ai^2-aj^2|>=0 =>(i^2-j^2)+(ai^2-aj^2)=>(i^2+ai^2)-(j^2+aj^2)
//2: |i^2-j^2|>=0且|ai^2-aj^2|<0  =>(i^2-j^2)-(ai^2-aj^2)=>(i^2-ai^2)-(j^2-aj^2)
//3:   <0且>=0  =>-(i^2-j^2)+(ai^2-aj^2)=>-(i^2-ai^2)+(j^2-aj^2)
//4:   <0且<0   =>-(i^2-j^2)-(ai^2-aj^2)=>-(i^2+ai^2)+(j^2+aj^2)
//相似的放在一起直观的比较一下
//(i^2+ai^2)-(j^2+aj^2)     i>=j且ai>=aj的情况
//-(i^2+ai^2)+(j^2+aj^2)    i<j且ai<aj的情况
//观察可以知道都是()大的-()小的,我们排序后取用最大值-最小值就可以

//(i^2-ai^2)-(j^2-aj^2)     i>=j且ai<aj的情况
//-(i^2-ai^2)+(j^2-aj^2)    i<j且ai>=aj的情况
//这个也是同理,()大-()小
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define N 100005
//本题做法:|i^2-j^2|+|ai^2-aj^2|存在2个变量(因为ai,aj可以用下标i,j表示出来)
//但是ij之间没有必然联系,我们要试着化简把i,ai放在一起j,aj一起
//|i^2-j^2|+|ai^2-aj^2|,分类讨论可以得到4种情况
//1:|i^2-j^2|>=0且|ai^2-aj^2|>=0 =>(i^2-j^2)+(ai^2-aj^2)=>(i^2+ai^2)-(j^2+aj^2)
//2: |i^2-j^2|>=0且|ai^2-aj^2|<0  =>(i^2-j^2)-(ai^2-aj^2)=>(i^2-ai^2)-(j^2-aj^2)
//3:   <0且>=0  =>-(i^2-j^2)+(ai^2-aj^2)=>-(i^2-ai^2)+(j^2-aj^2)
//4:   <0且<0   =>-(i^2-j^2)-(ai^2-aj^2)=>-(i^2+ai^2)+(j^2+aj^2)
//相似的放在一起直观的比较一下
//(i^2+ai^2)-(j^2+aj^2)     i>=j且ai>=aj的情况
//-(i^2+ai^2)+(j^2+aj^2)    i<j且ai<aj的情况
//观察可以知道都是()大的-()小的,我们排序后取用最大值-最小值就可以

//(i^2-ai^2)-(j^2-aj^2)     i>=j且ai<aj的情况
//-(i^2-ai^2)+(j^2-aj^2)    i<j且ai>=aj的情况
//这个也是同理,()大-()小
int n;
int a[N];
int b[N],c[N];

signed main() {
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++){
        b[i]=i*i+a[i]*a[i];
        c[i]=i*i-a[i]*a[i];
    }
    sort(b+1,b+1+n);
    sort(c+1,c+1+n);
    int ans=0;
    ans=max(b[n]-b[1],c[n]-c[1]);
    cout<<ans<<endl;
    return 0;
}

发表于 2025-08-24 10:09:56 回复(0)

问题信息

上传者:牛客301599号
难度:
10条回答 3254浏览

热门推荐

通过挑战的用户

查看代码
最大 FST 距离