题目描述https://ac.nowcoder.com/acm/contest/23481/B
题目描述
给出长度为n的整数数组a1,a2,...,an,定义序列的价值为
当数组长度为1时,价值认为是0。
求有多少不同的1≤i1<i2<...<ik≤n(1≤k≤n)满足子序列ai1,ai2,...,aik的价值等于a1,a2,...,an的价值。
由于答案可能很大,对答案mod 998244353
输入描述:
输出描述:
思考发现不影响答案的选择必须是序列满足是单调的,如a1<=a2<=a3.....<=ak或a1>=a2>=a3>=....ak,那么删去除a1,ak以外的任何一个都可以,那么我们只需要统计原数列的单调性,并把它们分成几个块,对于每个块,除第一个和最后一个每个数都有删或者不删两种选择,即对答案的贡献即为2^cnt,cnt即为所有对答案有贡献的数的个数
代码
#include <bits/stdc++.h>
#define N 100005
using namespace std;
const int mod = 998244353;
int a[N], p2[N];
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
p2[0] = 1;
for (int i = 1; i < N; i++)
p2[i] = p2[i - 1] * 2 % mod;
int t, n;
cin >> t;
while (t--)
{
long long ans = 1;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
{
int j = i;
while (j <= n && a[j] == a[j + 1])
j++;
if (i != 1 && j != n && (a[i - 1] < a[i] && a[j + 1] > a[i] || a[i - 1] > a[i] && a[j + 1] < a[i]))
ans = ans * p2[j - i + 1] % mod;
else
ans = ans * (p2[j - i + 1] - 1 + mod) % mod;
i = j;
}
cout << ans << endl;
}
return 0;
}