不确保正确,写了重载但是没有sort,复杂度应该是O(Tn) 呜呜呜
#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#define reg register
#define mp make_pair
typedef __int128 LL;
typedef long long ll;
typedef pair<int, int> PII;
namespace cyyh {
template <typename T>
il void read(T &x) {
x = 0; T f = 1; char ch;
while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
}
template <typename T>
il void write(T x) {
if (x < 0) ptc('-'), x = -x;
if (x > 9) write(x / 10);
ptc(x % 10 + '0');
}
template <typename T>
il T lowbit(const T &x) {
return x & -x;
}
}
using namespace cyyh;
const int N = 3e5 + 5;
int T, n, a[N];
struct node {
int x, pos, t;
bool operator < (const node &r) const {
return t > r.t;
}
} b[N];
int main() {
// freopen("1.txt", "w", stdout);
read(T);
bool flg = 0;
if (T == 1) flg = 1;
while (T--) {
read(n);
memset(b, 0, sizeof b);
int ans = 0;
for (int i = 1; i <= n; ++i) {
read(a[i]);
}
for (int i = 1; i <= n; ++i) {
if (i > 1 && a[i] > a[i - 1] && i < n && a[i] > a[i + 1]) ++b[i].x;
if (i > 1 && a[i] < a[i - 1] && i < n && a[i] < a[i + 1]) ++b[i].x;
ans += b[i].x;
b[i].pos = i;
}
// if (flg == 1) cout << ans << endl;
for (int i = 2; i < n; ++i)
b[i].t = b[i - 1].x + b[i + 1].x + b[i].x;
int pos = 0, maxn = 0;
for (int i = 2; i < n; ++i) {
if (b[i].t > maxn) {
maxn = b[i].t;
pos = i;
}
}
int id = pos, cnt = 0, cnt2 = 0;
// cout << id << endl;
a[id] = a[id - 1];
--id;
if (a[id] > a[id - 1] && a[id] > a[id + 1] && id > 1 && id < n) ++cnt;
if (a[id] < a[id - 1] && a[id] < a[id + 1] && id > 1 && id < n) ++cnt;
id += 2;
if (a[id] > a[id - 1] && a[id] > a[id + 1] && id > 1 && id < n) ++cnt;
if (a[id] < a[id - 1] && a[id] < a[id + 1] && id > 1 && id < n) ++cnt;
--id;
a[id] = a[id + 1];
--id;
if (a[id] > a[id - 1] && a[id] > a[id + 1] && id > 1 && id < n) ++cnt2;
if (a[id] < a[id - 1] && a[id] < a[id + 1] && id > 1 && id < n) ++cnt2;
id += 2;
if (a[id] > a[id - 1] && a[id] > a[id + 1] && id > 1 && id < n) ++cnt2;
if (a[id] < a[id - 1] && a[id] < a[id + 1] && id > 1 && id < n) ++cnt2;
--id;
// cout << "cnt2: " << cnt2 << ' ' << id << endl;
if (cnt < cnt2) a[id] = a[id - 1];
ans = 0;
for (int i = 1; i <= n; ++i) {
// cout << a[i] << ' ';
if (i > 1 && a[i] > a[i - 1] && i < n && a[i] > a[i + 1]) ++ans;
if (i > 1 && a[i] < a[i - 1] && i < n && a[i] < a[i + 1]) ++ans;
// cout << ans << "! ";
}
// cout << "\n!!";
write(ans), ptc('\n');
}
return 0;
}