给定一个长度为 n 的整数数组 a1,a2,…,an。
请你构造长度为 n 的整数数组 b1,b2,…,bn,要求数组 b 满足:b1=0。
对于任意一对索引 i 和 j(1≤i,j≤n),如果 ai=aj 则 bi=bj(注意,如果 ai≠aj,则 bi 和 bj 相等与否随意)。
对于任意索引 i(i∈[1,n−1]),要么满足 bi=bi+1,要么满足 bi+1=bi+1。
请计算,一共可以构造出多少个不同的满足条件的数组 b。
由于答案可能很大,你只需要输出对 998244353 取模后的结果。
例如,如果 a=[1,2,1,2,3],则一共有 2 个满足条件的数组 b,分别是 b=[0,0,0,0,0] 和 b=[0,0,0,0,1]。
输入格式
第一行包含一个整数 n。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
一个整数,表示对 998244353 取模后的结果。
数据范围
前 3 个测试点满足 2≤n≤5。
所有测试点满足 2≤n≤2×105,1≤ai≤109。
输入样例1:
5
1 2 1 2 3
输出样例1:
2
输入样例2:
2
100 1
输出样例2:
2
输入样例3:
4
1 3 3 7
输出样例3:
4
分析:
题目有一个特点就是 b数组是一个单调不递减,然后因为ai = aj 然后 bi = bj,所以可以得到i~~~j之间的元素必须是全部相同的才行,即这样区间内的值是相同的,这样就只用计算不再这些区间内的位置,比如 数组a = {1 3 1 3 5} b[0]~b[3] 全是0,没在这个区间的只有最后一个位置,所以b数组只有两种情况
代码:
from collections import deque
INF = 998244353
n = int(input().strip())
lis = list(map(int,input().strip().split()))
f = []
equils = dict()
for i in range(n):
if lis[i] not in equils.keys():
equils[lis[i]] = [i,-1]
else:
equils[lis[i]][1] = i
for a,b in equils.items():
if b[1]!=-1:
f.append(b)
res = 1
point = 0
for i in f:
if point < i[0]:
res = (res * 2**(i[0] - point)) % INF
if point < i[1]:point = i[1]
if n-1 > point:res = (res * 2**(n-1 - point)) % INF
print(res)