CF 1913 D
题目描述
给定一个所有数互不相同的长度为
- 选择一对
,并把其中除最小值外的所有元素删除。
求最终可以得到的不同序列数量。
思路
我们考虑怎样通过删除最少的元素来删除
我们每次都只删除这种最小区间,因为这样会使最终的方案更多。
令
我们有
时空复杂度均为
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 300001, MOD = 998244353;
int t, n, a[MAXN], stk[MAXN], top, dp[2][MAXN], sum[MAXN];
void Solve() {
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> a[i];
}
top = 0;
dp[1][0] = sum[0] = 1;
for(int i = 1; i <= n; ++i) {
for(; top && a[stk[top]] >= a[i]; --top) {
}
int j = stk[top];
dp[0][i] = (j ? (dp[1][j] + dp[0][j]) % MOD : 0);
dp[1][i] = (0ll + dp[0][j] + sum[i - 1] - (j ? sum[j - 1] : 0) + MOD) % MOD;
sum[i] = (sum[i - 1] + dp[1][i]) % MOD;
stk[++top] = i;
}
cout << (dp[0][n] + dp[1][n]) % MOD << "\n";
}
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
for(cin >> t; t--; Solve()) {
}
return 0;
}
本文作者:Yaosicheng124
本文链接:https://www.cnblogs.com/yaosicheng124/p/18417352
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步