题目描述:

You are given an array consisting of nmonotonic renumeration as an array b consisting of \(n\)integers such that all of the following conditions are met:

  • b1=0;

  • for every pair of indices iand jsuch that 1≤i,jn, then \(b_i=b_j\), it is still possible that \(b_i=b_j\)

    for every index i∈[1,n−1] either \(b_i=b_{i+1}\) or \(b_{i+1}\)=\(b_i\)+1

For example, if a=[1,2,1,2,3], then two possible monotonic renumerations of are b=[0,0,0,0,0]\(b=[0,0,0,0,1]\).

Your task is to calculate the number of different monotonic renumerations of a. The answer may be large, so print it modulo \(998244353\).

Input

The first line contains one integer n(\(2\leq{n}\leq{2*10^5}\)) — the number of elements in a

The second line contains n

integers (\(1≤a_i≤10^9\))

Output

Print one integer — the number of different monotonic renumerations of a, taken modulo 998244353.

Examples

Input

Copy

5
1 2 1 2 3

Output

Copy

2

Input

Copy

2
100 1

Output

Copy

2

Input

Copy

4
1 3 3 7

Output

Copy

4

思路:

题目的意思是给一个数列a,构造数列b,按照以下规则:如果a中有相同的元素,相同元素的位置对应在b中位置上的元素必须也想同。还有b是非减数列,一次最多增加1.

那么我们可以知道a相同元素的位置对应在b的位置,这个位置之间的所有元素在b中必须相同。因为b中元素要么与前一个一样,要么大一。

题目就变成了,找到重合的区间加起来得到总的重合区间,这个总区间上的元素在b中必须相同。

可以在输入时记录下每个元素的最远相同元素的位置,如果没有相同元素就记录本身位置。然后遍历一遍数组,记录当前重合区间的右端点。如果元素位置在当前重合区间右端点内,元素必须相同,没得选,就不断更新重合区间右端点;直到元素位置大于区间右端点,说明已经不在重合区间内,可以选择元素大小了,有两种选法,总结果就乘上2,然后把区间右端点更新为当前位置,继续遍历。注意这个不在区间内本身就可能是新的重合区间,而不只是不在重合区间内的一个点。按照算法乘以二更新右端点后就可以正确继续执行。

代码:

#include <iostream>
#include <map>
#define maxn 200005
#define mod 998244353
using namespace std;
int n;
int a[maxn];
map<int,int> mp;
int main()
{
cin >> n;
for(int i = 0;i<n;i++)
{
cin >> a[i];
mp[a[i]] = i;
}
int right = 0;//当前区间右端点
long long ans = 1;
for(int i = 0;i<n;i++)
{
if(i<=right)
{
right = max(right,mp[a[i]]);
}
else
{
ans = (ans*2)%mod;
right = mp[a[i]];
}
}
cout << ans << endl;
return 0;
}

Codeforces J. Monotonic Renumeration(组合)的更多相关文章

  1. 补题Codeforces 1102E. Monotonic Renumeration

    这个题还是不太懂,下面附上的是大佬的题解(https://zhanghuimeng.github.io/post/codeforces-1102e-monotonic-renumeration/) E ...

  2. 【Codeforces 1102E】Monotonic Renumeration

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 会发现如果a[i]=a[j] 那么b[i]~b[j]都是相同的,等于b[i] 而b[i]等于b[i-1]+1或者b[i] 有两种可能 所以对于 ...

  3. Codeforces Round #531 (Div. 3) E. Monotonic Renumeration (构造)

    题意:给出一个长度为\(n\)的序列\(a\),根据\(a\)构造一个序列\(b\),要求: ​ 1.\(b_{1}=0\) ​ 2.对于\(i,j(i\le i,j \le n)\),若\(a_{i ...

  4. Codeforces 140E(排列组合、dp)

    要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ...

  5. CodeForces 131C C (组合)

    There are n boys and m girls attending a theatre club. To set a play "The Big Bang Theory" ...

  6. Codeforces 15E Triangles 【组合计数】

    Codeforces 15E Triangles Last summer Peter was at his granny's in the country, when a wolf attacked ...

  7. Codeforces J. Sagheer and Nubian Market(二分枚举)

    题目描述: Sagheer and Nubian Market time limit per test 2 seconds memory limit per test 256 megabytes in ...

  8. Codeforces J. Soldier and Number Game(素数筛)

    题目描述: Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes inpu ...

  9. Codeforces J. A Simple Task(多棵线段树)

    题目描述: Description This task is very simple. Given a string S of length n and q queries each query is ...

随机推荐

  1. python 科学计算基础库安装

    1.numpyNumPy(Numeric Python)是用Python进行科学计算的基本软件包. NumPy是Python编程语言的扩展,增加了对大型多维数组和矩阵的支持,以及一个大型的高级数学函数 ...

  2. JAVAFX 项目 SpringBoot 最简单的集成

    1,JAVA 版本 JDK 1.8 2,首先我们创建一个 springboot 的空项目,只添加以下的依赖 <dependency> <groupId>org.springfr ...

  3. C#.NET XML 与 实体 MODEL 互转,非序列化

    只能处理简单结构XML 和 实体. using System.Text; using System.Xml; namespace A.Util { public static class MyXmlU ...

  4. 基于zynq 7020的串口UART中断实验

    1.参考 UG585,P1790[JokerのZYNQ7020]UART学会Zynq(27)UART中断驱动模式示例 2.理论知识 在ZYNQ的中断中有一个IOP的中断集,它包几个外设的中断,其中包含 ...

  5. Java实现RSA加密&AES加密&DES加密

    RSA package com.demo; import org.springframework.util.StringUtils; import javax.crypto.Cipher; impor ...

  6. 手撕面试官系列(十):面试必备之常问Dubbo29题+MySQL55题

    Dubbo专题 (面试题+答案领取方式见侧边栏) 1.Dubbo 支持哪些协议,每种协议的应用场景,优缺点?2.Dubbo 超时时间怎样设置?3.Dubbo 有些哪些注册中心?4.Dubbo 集群的负 ...

  7. DRF框架(九)——drf偏移分页组件、drf游标分页组件(了解)、自定义过滤器、过滤器插件django-filter

    drf偏移分页组件 paginations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...

  8. 【PYQT5快速开发】重定义边框、QSS美化皮肤主题

    在用qt designer的基础上重定义边框 前言 作为一名技术工作者,偶有使用.开发工具的需求.制作工具时,既不想在界面上花太懂功夫,又想要工具模样与众不同,结果找半天找不到一键换装的功能/拍砖. ...

  9. JavaWeb项目之多条件过滤

    相信很多同学在学习java基础之后,面对各种项目还是相当头疼,那今天我将手把手教你学会JavaWeb项目中的多条件过滤,希望你能在与我实战的过程中积累经验,更进一步. 分页查询 需求分析:在列表页面中 ...

  10. 了解下Scala隐式转换与柯理化

    之前有看过kafka源码,有很多implict声明的方法,当时看的一头雾水,今天趁着空闲,了解下scala 的隐式转换和柯理化相关语法知识. 隐式转换 需要类中的一个方法,但是这个类没有提供这样的一个 ...