取最大值与最小值的平均数就行啦
注:inf一定要开的足够大不然会WA
#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<string.h>
#include<map>
#include<math.h>
#include<queue>
using namespace std;
#define ll long long
#define inf 1000000005
ll a[100005];
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)scanf("%lld", &a[i]);
ll maxn = 0, minn = inf;
for (int i = 0; i < n; i++)
{
if (a[i] == -1)
{
if (i == 0)
{
if (a[i + 1] != -1)
{
maxn = max(a[i + 1], maxn);
minn = min(a[i + 1], minn);
}
}
else if (i == n - 1)
{
if (a[i - 1] != -1)
{
maxn = max(a[i - 1], maxn);
minn = min(a[i - 1], minn);
}
}
else
{
if (a[i + 1] != -1)
{
maxn = max(a[i + 1], maxn);
minn = min(a[i + 1], minn);
}
if (a[i - 1] != -1)
{
maxn = max(a[i - 1], maxn);
minn = min(a[i - 1], minn);
}
}
}
}
if (maxn == 0 && minn == inf)
{
printf("0 0\n");
continue;
}
ll ans = (maxn + minn) / 2;
ll m=0;
for (int i = 0; i + 1 < n; i++)
{
if (a[i] == -1)a[i] = ans;
if (a[i + 1] == -1)a[i + 1] = ans;
if (abs(a[i] - a[i + 1]) > m)
{
m = abs(a[i] - a[i + 1]);
}
}
printf("%lld %lld\n", m, ans);
}
}