正难则反。
从a的子序列中挑出几个权值加起来与a序列原本权值相同的序列并不容易,既然是求子序列我们是否可以考虑一种保持答案不变的删除方法。
很显然,ai==ai+1,直接删除,不影响结果。
ai-1<ai<ai+1;
ai-1>ai>ai+1;
以上两种情况ai都可以直接删除。
于是,看代码。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 500010;
ll a[N];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
int ans = 1;
int j = 1;
while (j < n) {
if (a[j] == a[j + 1]) {//ai==ai+1直接跳过不参与到代码之中。
j++;
} else if (a[j + 1] > a[j]) {
while (a[j + 1] >= a[j]) {
j++;//将一整个大于ai的块看作一个答案,只进行一次加一,因为下一个直接并入到下一个子序列之中,下面也同上。
}
ans++;
} else if (a[j + 1] < a[j]) {
while (a[j + 1] <= a[j]) {
j++;
}
ans++;
}
}
cout << ans << "\n";
}
}