题解:AT_agc058_b [AGC058B] Adjacent Chmax
Solution
把操作视为染色。那么一个数能染到的区间是
从
对于
更好理解的方式是枚举
Code
#include<algorithm>
#include<iostream>
#include<cstdio>
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
typedef long long ll;
namespace FastIO{
template<typename T=int> T read(){
T x=0;int f=1;char c=getchar();
while(!isdigit(c)){if(c=='-') f=~f+1;c=getchar();}
while(isdigit(c)){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
template<typename T> void write(T x){
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
template<typename T> void Write(T x,char c='\n'){write(x);putchar(c);}
}
using namespace FastIO;
const int MOD=998244353;
const int maxn=5005;
int f[maxn][maxn],a[maxn];
int main(){
int n=read();
for(int i=1;i<=n;i++) a[i]=read();
f[0][0]=1;a[0]=a[n+1]=n+1;
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++) f[i][j]=f[i-1][j];
int L=i,R=i;
while(a[L]<=a[i]) L--;
while(a[R]<=a[i]) R++;
for(int j=L+1;j<R;j++) f[i][j]=(f[i][j]+f[i][j-1])%MOD;
}
write(f[n][n]);
return 0;
}