构造数组详解

4412.构造数组

给定一个长度为 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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dearzcs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值