题意:
给定一个数列,让你选定一个 x ,然后让所有数都变成 abs(a[i]-x),问你 x 取多少可以使该数列变成不严格递增
思路:
这道题,利用了一个性质
对于两个数 a,b
当x的值小于 (a+b)/2 时,它保持原本的单调性
当x的值等于(a+b)/2时,a==b
当x的值大于(a+b)/2时,单调性反一下
因此,如果遇到升序的,x就得小于(a+b)/2,即x属于 [-inf,(a+b)/2]
遇到降序的,x就得大于(a+b)/2+1,即x属于 [(a+b)/2+1,inf]
然后把这些区间取个交集就好了
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxn=2e5+10,mnf=1e18;
int n,l,r;
int a[mxn];
void solve(){
l=0,r=mnf;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n;i++){
int x=0,y=mnf;
if(a[i]>a[i-1]) y=(a[i]+a[i-1])/2;
else if(a[i]<a[i-1]) x=(a[i]+a[i-1]+1)/2;
l=max(l,x),r=min(r,y);
}
if(l>r) cout<<-1<<'\n';
else cout<<l<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}
总结:
总结一个性质:
对于两个数 a,b,使它们变成abs(a-x),abs(b-x)
当x的值小于 (a+b)/2 时,它保持原本的单调性
当x的值等于(a+b)/2时,a==b
当x的值大于(a+b)/2时,单调性反一下