分析:
假设x同时小于或者大于a[i]和a[i+1],那么不会改变单调性,只有x在两数之间才可以改变单调性,而(a[i]+a[i+1])/2为边界条件,一旦超过(a[i]+a[i+1])/2就会改变单调性,a[i]=a[i+1]可以不做考虑,永远不会改变单调性,那么可以遍历数组,取所有a[i]<a[i+1]的最大边界的最小值才能满足整个数组不会被反转,即最小的(a[i]+a[i+1])/2的值,取所有a[i]>a[i+1]的最小边界的最大值,即最大的(a[i]+a[i+1]+1)/2,最后比较最小的(a[i]+a[i+1])/2的值是否小于最大的(a[i]+a[i+1]+1)/2的值,如果小于,那么说明无解,输出-1,否则输出区间内任意值。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=2e5+10;
int a[N];
void solve()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int maxn=0;
int minn=1e9;
for(int i=1;i<n;i++)
{
if(a[i]<a[i+1]) minn=min(minn,(a[i]+a[i+1])/2);
if(a[i]>a[i+1]) maxn=max(maxn,(a[i]+a[i+1]+1)/2);
}
if(maxn<=minn) cout<<maxn<<'\n';
else cout<<-1<<'\n';
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}