算法:贪心
思路:我们要操作数组变成递增的数据 因为你可以选择负数 所以我们可以让前x个数变成负的 后n-x个数为正的 我们先把每两个数之间的大小关系记录一下 数组d 1为我小于我后面的数 -1为我大于我后面的数 0为相同 循环枚举x为 1到n 因为我把前x个数变成负数最低需要操作一次 所以now先+1 然后每次遇到递减的也就是-1 我们就可以少操作一次 如果每次遇到1我们就得多操作一次 由于我们一开始的ans是把所有相邻相同的数也多操作一次 所以我们如果x的右边的数和x相同 我们就可以少操作一次
#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;using ll = long long;using PLL = pair<ll,ll>;
const ll MAX = 1e18;const ll MIN = -1e18;const ll INF=0x3f3f3f3f;
const ll Q = 2e5+9;const ll MOD = 1e9 + 7;
ll a[Q],d[Q];
void solve(){
ll n;cin>>n;
for (ll i = 1; i <= n; i++)
{
cin>>a[i];
}
ll now=0;;ll ans=0;
for (ll i = 1; i < n; i++)
{
if(a[i+1]>a[i]) d[i]=1;
else if(a[i+1]<a[i]) d[i]=-1;
else d[i]=0;
if(d[i]!=1) now++;
//cout<<d[i]<<" ";
}
ans=now;
now++;
for (ll i = 1; i < n; i++)
{
ans=min(ans,now);
if(d[i]==-1) now--;
if(d[i]==1) now++;
if(i+1<n and d[i+1]==0)
ans=min(ans,now-1);
else ans=min(ans,now);
}
cout<<ans<<"\n";
}
int main(){
ios;ll _=1;cin>>_;
while (_--)solve();
return 0;
}