CF1913D 题解
sunkuangzheng · · 题解
组合数学不太好做,考虑 dp。设
答案是
第一个转移式子的含义是,如果第
直接做是
赛时代码,注意
/**
* author: sunkuangzheng
* created: 18.12.2023 23:06:42
**/
#include<bits/stdc++.h>
using ll = long long;
#define int long long
const int N = 5e5+5,mod = 998244353;
using namespace std;
int T,n,a[N],st[N],tp,sm[N],f[N],g[N];
void los(){
cin >> n;tp = 0;
for(int i = 1;i <= n;i ++) cin >> a[i];
f[0] = sm[0] = 1;
for(int i = 1;i <= n;i ++){
while(tp && a[st[tp]] > a[i]) tp --;
int j = st[tp];if(j) g[i] = (f[j] + g[j]) % mod; else g[i] = 0;
f[i] = (sm[i-1] - (j == 0 ? 0 : sm[j-1]) + g[j] + mod) % mod,
sm[i] = (sm[i-1] + f[i]) % mod,st[++tp] = i;
}cout << (f[n] + g[n]) % mod << "\n";
}signed main(){
ios::sync_with_stdio(0),cin.tie(0);
for(cin >> T;T --;) los();
}