帮我调出来的获得 min(你的题解总数,6) 个题解点赞(一篇两个)。
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int a[N], arr1[N], arr2[N], t[N], c[N];
int main()
{
int n;
int T;
cin >> T;
while (T--)
{
cin >> n;
for (int i = 1; i <= n; i ++)
scanf ("%d", &a[i]);
for (int i = 0; i <= n + 1; i ++)
arr1[i] = arr2[i] = t[i] = 0;
int cnt = 0;
for (int i = 1; i <= n; i ++)
if (a[i] > t[cnt])
{
arr1[i] = ++ cnt;
t[cnt] = a[i];
}
else
{
auto p = upper_bound(t + 1, t + cnt + 1, a[i]) - t;
arr1[i] = p;
t[p] = a[i];
}
cnt = 0;
for (int i = 1; i <= n; i ++)
a[i] = -a[i];
for (int i = 0; i <= n + 1; i ++)
c[i] = -1e9;
for (int i = n; i; i --)
if (a[i] > c[cnt])
{
arr2[i] = ++ cnt;
c[cnt] = a[i];
}
else
{
auto p = upper_bound(c + 1, c + cnt + 1, a[i]) - c;
arr2[i] = p;
c[p] = a[i];
}
for (int i = 1; i <= n; i ++)
a[i] = -a[i];
vector <int> cent;
for (int i = 1; i <= n; i ++)
if (arr1[i] + arr2[i] - 1 == cnt)
cent.push_back(i);
printf ("%d\n", (int)cent.size());
sort (cent.begin(), cent.end());
for (auto &u : cent)
printf ("%d ", u);
printf ("\n");
}
return 0;
}