vector<int> A(N); for (int i = 0; i < N; i++) { cin >> A[i]; A[i]--; }
auto check = [&](int l, int r) { vector<int> a(A.begin() + l, A.begin() + r); auto g = a; ranges::sort(g); g.erase(ranges::unique(g).begin(), g.end()); for (auto& x : a) { x = ranges::lower_bound(g, x) - g.begin(); } vector<pair<int, int>> stk; for (auto x : a) { pair<int, int> cur {x, x}; while (!stk.empty()) { if (stk.back().second + 1 == cur.first) { cur = {stk.back().first, cur.second}; stk.pop_back(); } elseif (cur.second + 1 == stk.back().first) { cur = {cur.first, stk.back().second}; stk.pop_back(); } else { break; } } stk.push_back(cur); } return stk.size() == 1; };
int res = 0; int l = 0; while (l < N) { int lo = l + 1, hi = N + 1; for (int k = 1; k + l <= N; k *= 2) { if (!check(l, l + k)) { hi = l + k; break; } } while (lo < hi) { int mid = lo + hi >> 1; if (check(l, mid)) { lo = mid + 1; } else { hi = mid; } } lo--; l = lo; res++; } cout << N - res << '\n'; return; }
vector<int> A(N); for (int i = 0; i < N; i++) { cin >> A[i]; A[i]--; }
vector<array<int, 2>> seg; for (int l = 0, r = 1; r < N; r++) { if (r == N - 1 || A[r] > max(A[r - 1], A[r + 1]) || A[r] < min(A[r - 1], A[r + 1])) { // A[r] 是一个局部最大值或最小值,要分成一个段 // 这里 +1-1 是因为不知道极值点在左右哪个段里,需要枚举 if (l + 0 <= r - 0) seg.push_back({ l + 0, r - 0 }); if (l + 0 <= r - 1) seg.push_back({ l + 0, r - 1 }); if (l + 1 <= r - 0) seg.push_back({ l + 1, r - 0 }); if (l + 1 <= r - 1) seg.push_back({ l + 1, r - 1 }); l = r; } } ranges::sort(seg); seg.erase(ranges::unique(seg).begin(), seg.end());
auto check = [&](int l1, int r1, int l2, int r2) { // check if [l1, r1] and [l2, r2] are intersected if (l1 > r1) swap(l1, r1); if (l2 > r2) swap(l2, r2); returnmax(l1, l2) <= min(r1, r2); };
vector<int> f(seg.size(), -inf); int ans = 0; for (int i = 0; i < seg.size(); i++) { auto [l1, r1] = seg[i]; if (l1 == 0) { f[i] = 1; } elsefor (int j = max(0, i - 8); j < i; j++) { // 这里我也不确定要跑几个,8 个比较稳妥 auto [l2, r2] = seg[j]; if (r2 + 1 == l1 && check(A[l2], A[r2], A[l1], A[r1])) { chmax(f[i], f[j] + 1); } } if (r1 == N - 1) { chmax(ans, f[i]); } } cout << N - ans << "\n"; return; }