题目链接:Codeforces - Monotonic Renumeration
因为任意两个相同的数字之间必须相等,其实就是这两个数之间只能填同一个数字。
所以相当于就是把区间分成一个部分 答案就是 ans=2^(cnt-1)
所以就是求多少部分,前缀和维护即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10,mod=998244353;
int n,a[N],sum[N],res,ans=1; map<int,int> mp,vis;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]),mp[a[i]]=i;
for(int i=1;i<=n;i++){
if(vis[a[i]]||mp[a[i]]==i) continue;
sum[i+1]++,sum[mp[a[i]]+1]--;
}
for(int i=1;i<=n;i++) sum[i]+=sum[i-1];
for(int i=1;i<=n;i++) if(!sum[i]) res++;
for(int i=1;i<res;i++) ans=1LL*ans*2%mod;
cout<<ans;
return 0;
}