CF1913D Array Collapse
spider_oyster · · 题解
设
假设我们要从
如果
考虑分两种情况,
对于
注意,当当前单调栈为空的时候,
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5,p=998244353;
int n,m,top,a[N],f[N],s[N],stk[N];
inline int rd()
{
int x=0;char c=getchar();
for(;!isdigit(c);c=getchar());
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^48);
return x;
}
void solve()
{
n=rd();
for(int i=1;i<=n;i++) a[i]=rd();
int sum=0;top=0;
for(int i=1;i<=n;i++)
{
while(top&&a[stk[top]]>a[i]) sum=(sum-f[stk[top]]+p)%p,top--;
f[i]=(sum+s[i-1]-s[stk[top]]+(top==0)+p)%p;
s[i]=(s[i-1]+f[i])%p;
stk[++top]=i,sum=(sum+f[i])%p;
}
cout<<sum<<'\n';
}
signed main()
{
int t=rd();
while(t--) solve();
}