Codeforces J. Monotonic Renumeration(组合)
题目描述:
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,j≤n, 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(组合)的更多相关文章
- 补题Codeforces 1102E. Monotonic Renumeration
这个题还是不太懂,下面附上的是大佬的题解(https://zhanghuimeng.github.io/post/codeforces-1102e-monotonic-renumeration/) E ...
- 【Codeforces 1102E】Monotonic Renumeration
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 会发现如果a[i]=a[j] 那么b[i]~b[j]都是相同的,等于b[i] 而b[i]等于b[i-1]+1或者b[i] 有两种可能 所以对于 ...
- 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 ...
- Codeforces 140E(排列组合、dp)
要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ...
- CodeForces 131C C (组合)
There are n boys and m girls attending a theatre club. To set a play "The Big Bang Theory" ...
- Codeforces 15E Triangles 【组合计数】
Codeforces 15E Triangles Last summer Peter was at his granny's in the country, when a wolf attacked ...
- Codeforces J. Sagheer and Nubian Market(二分枚举)
题目描述: Sagheer and Nubian Market time limit per test 2 seconds memory limit per test 256 megabytes in ...
- Codeforces J. Soldier and Number Game(素数筛)
题目描述: Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes inpu ...
- Codeforces J. A Simple Task(多棵线段树)
题目描述: Description This task is very simple. Given a string S of length n and q queries each query is ...
随机推荐
- c# 字符串递归截取
private void button1_Click_1(object sender, EventArgs e) { string ex = neirong.Text; List<string& ...
- Java 注解基本原理
原文地址 注解的本质 「java.lang.annotation.Annotation」接口中有这么一句话,用来描述『注解』. The common interface extended by all ...
- python:求整数的二进制表示
求解方法: 1.整数求余 2.重复进行,整数除2再求余,直到除数为0 3.拼接余数 4.反转字符串 def int2two(intNo): twoStr='' if intNo == 0: twoSt ...
- 虚拟机centos与主机互相Ping通
在虚拟机(Vmware Workstation)下,安装了CentOS7,现在想通过SSH工具连接虚拟机中的CentOS7 1. 首先,要确保CentOS7安装了 openssh-server,在 ...
- SQL Server 中的Merge关键字(转载)
简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...
- Java基础知识点总结(三)
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
- grpc Unary模式下客户端创建insecure channel的主要流程
(原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端创建insecure channel的主要流程 gr ...
- Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)
一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...
- JDK8源码解析 --- Long 类型
最近都在看JDK8的源码,想把记录下来与大家一起共享,每天 积累一点,每天成长一点.看了装箱Long类型,有好多以前没有注意到或者不知道的内容,慢慢懂得.废话不多说,直接上代码讲解... 1.缓存区L ...
- idea 添加 VUE 的语法
1,首先我们先让 HTML 文件支持 VUE 的语法指令提示 2,File -> Setting -> Edit -> Inspections -> html 3.加入以下: ...