提交时间:2024-10-24 13:31:01

运行 ID: 33838

#include <bits/stdc++.h> #define int long long #define rep(i, l, r) for (int i = l; i <= r; i++) #define per(i, r, l) for (int i = r; i >= l; i--) using namespace std; int t; int a[400005], ad[400005]; signed main() { // freopen("shuffle.in", "r", stdin); // freopen("shuffle.out", "w", stdout); scanf("%lld", &t); while (t--) { int n; scanf("%lld", &n); bool yx = 1; rep(i, 1, n) { scanf("%lld", &a[i]); if (a[i] < a[i - 1]) yx = 0; } if (n <= 100) { int ans = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j < i; j++) { swap(a[i], a[j]); int cnt = 0; // puts(""); for (int k = 1; k <= n; k++) { bool b = 1; for (int l = 1; l <= n; l++) { if (l < k && a[l] > a[k] || l > k && a[l] < a[k]) { b = 0; break; } } cnt += b; // if (b) // { // printf("%lld ", k); // } } // if (cnt > ans) // { // printf("%lld %lld\n", i, j); // } ans = max(ans, cnt); swap(a[i], a[j]); } } printf("%lld\n", ans); continue; } if (yx) { printf("%lld\n", n - 2); continue; } int p1 = -1, pw = -1; rep(i, 1, n) { if (a[i] != i) { p1 = i; rep(j, i + 1, n) { if (a[j] != j) { pw = j; break; } } break; } } int e1 = -1, ew = -1; per(i, n, 1) { if (a[i] != i) { e1 = i; per(j, i - 1, 1) { if (a[j] != j) { ew = j; break; } } break; } } // printf("%lld %lld %lld %lld\n", p1, pw, e1, ew); if (pw == e1 && p1 == ew) { printf("%lld\n", n); continue; } int pos = 1; rep(i, p1 + 1, n) { if (a[i] == p1) { pos = i; break; } } swap(a[p1], a[pos]); int pp = n; rep(i, 1, n) { if (a[i] != i) { pp = i - 1; break; } } int pe = n; per(i, n, 1) { if (a[i] != i) { pe = n - i; break; } } // printf("%lld %lld %lld\n", pos, pp, pe); if (pp == n) { printf("%lld\n", pp); continue; } swap(a[p1], a[pos]); int pos1 = n; per(i, e1 - 1, 1) { if (a[i] == e1) { pos1 = i; break; } } swap(a[e1], a[pos1]); int pp1 = n; rep(i, 1, n) { if (a[i] != i) { pp1 = i - 1; break; } } int pe1 = n; per(i, n, 1) { if (a[i] != i) { pe1 = n - i; break; } } // printf("%lld %lld %lld\n", pos1, pp1, pe1); printf("%lld\n", max(pp + pe, pp1 + pe1)); } return 0; }