补题Codeforces 1102E. Monotonic Renumeration
这个题还是不太懂,下面附上的是大佬的题解(https://zhanghuimeng.github.io/post/codeforces-1102e-monotonic-renumeration/)
E. Monotonic Renumeration
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given an array a consisting of n integers. Let’s denote monotonic renumeration of array a as an array b consisting of n integers such that all of the following conditions are met:
b1=0;
for every pair of indices i and j such that 1≤i,j≤n, if ai=aj, then bi=bj (note that if ai≠aj, it is still possible that bi=bj);
for every index i∈[1,n−1] either bi=bi+1 or bi+1=bi+1.
For example, if a=[1,2,1,2,3], then two possible monotonic renumerations of a are b=[0,0,0,0,0] and 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≤n≤2⋅105) — the number of elements in a.
The second line contains n integers a1,a2,…,an (1≤ai≤109).
Output
Print one integer — the number of different monotonic renumerations of a, taken modulo 998244353.
Examples
inputCopy
5
1 2 1 2 3
outputCopy
2
inputCopy
2
100 1
outputCopy
2
inputCopy
4
1 3 3 7
outputCopy
4
题意
给定一个长度为n的数组a,要求为a生成一个对应的数组b,满足:
b[0] = 0
对于任意0 <= i < j <= n,如果满足a[i] == a[j],必有b[i] == b[j](不过a[i] != a[j]时也可能有b[i] == b[j])
任取0 <= i < n - 1,必有b[i] = b[i+1]或b[i] + 1 = b[i+1]
问共有多少种可能的b。
分析
显然b[i]是一个递增序列,因此可以自然推出,若a[i] == a[j],则必有b[i] == b[i+1] == … = b[j],也就是说,对于a中任意位置两个相等的元素,它们在b中对应的是一整段相等的元素。显然这种元素相等是可能会发生重叠的,因此一个自然的想法就是,把重复的元素建模成线段,然后合并发生overlap的线段以得到相等元素的最长长度。
我的做法是,从后向前遍历a,如果发现当前元素和后面的元素重复了,则取index最靠后的元素,组成一条线段,插入到栈中与其他元素合并;否则把它自己的index作为一条线段插入到栈中。最后栈中留下的就是几条互不相交(且并组成了整个区间)的线段。
对于(除了第一条之外)每条线段,我们可以选择让它的值和前一条相等,也可以选择让它的值是前一条+1。每种选择都会导致生成一种新的b。于是结果是2^{线段数-1}。
例子:对于a = {1, 2, 1, 2, 3},1对应的线段是[0, 2],2对应的线段是[1, 3],3对应的线段是[4, 4];合并之后得到两条线段,[0, 3]和[1, 4];只有两种b,分别是{0, 0, 0, 0, 0}和{0, 0, 0, 0, 1}。
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int a[200005];
int n;
typedef long long int LL;
const LL P = 998244353;
LL pow2(LL x) {
    LL pow = 2, ans = 1;
    while (x > 0) {
        if (x & 1)
            ans = (ans * pow) % P;
        pow = (pow * pow) % P;
        x >>= 1;
    }
    return ans;
}
int main() {
    map<int, int> indMap;
    vector<pair<int, int>> s;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        if (indMap.find(a[i]) == indMap.end()) {
            indMap[a[i]] = i;
        }
    }
    for (int i = n - 1; i >= 0; i--) {
        pair<int, int> interval;
        if (indMap.find(a[i]) != indMap.end() && indMap[a[i]] < i) {
            interval = make_pair(indMap[a[i]], i);
        }
        else {
            interval = make_pair(i, i);
        }
        if (!s.empty() && s.back().first <= interval.first && s.back().second >= interval.second)
            continue;
        if (!s.empty() && interval.second >= s.back().first) {
            interval.second = s.back().second;
            s.pop_back();
            s.push_back(interval);
        }
        if (s.empty() || interval.second < s.back().first)
            s.push_back(interval);
    }
    int cnt = 0;
    if (!s.empty() && s.front().second < n - 1) cnt++;
    if (!s.empty() && s.back().first > 0) cnt++;
    for (int i = 0; i < s.size(); i++) {
        cnt++;
        // 本条线段和前一条线段之间的间隔
        if (i > 0 && s[i - 1].second < s[i].first - 1)
            cnt++;
    }
    cout << pow2(cnt - 1) << endl;
    return 0;
}
												
											补题Codeforces 1102E. Monotonic Renumeration的更多相关文章
- Codeforces J. Monotonic Renumeration(组合)
		
题目描述: You are given an array consisting of nmonotonic renumeration as an array b consisting of \(n\) ...
 - 补题—Codeforces Round #346 (Div. 2) _智商欠费系列
		
这次的题目相对容易 但是智商依旧不够用 原因有三点 1.英文水平堪忧 2 逻辑不严密 3 细节掌握不够好 传送门 http://codeforces.com/contest/659 A 题目大意 圆环 ...
 - You Are Given a Decimal String... CodeForces - 1202B  [简单dp][补题]
		
补一下codeforces前天教育场的题.当时只A了一道题. 大致题意: 定义一个x - y - counter :是一个加法计数器.初始值为0,之后可以任意选择+x或者+y而我们由每次累加结果的最后 ...
 - 【cf补题记录】Codeforces Round #608 (Div. 2)
		
比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...
 - 【cf补题记录】Codeforces Round #607 (Div. 2)
		
比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...
 - Codeforces VP/补题小记 (持续填坑)
		
Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径.  考虑括号序列维护树的路径信息和,是将左括号看做 ...
 - 2017河工大校赛补题CGH    and  赛后小结
		
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
 - 4.30-5.1cf补题
		
//yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...
 - 【补题记录】ZJU-ICPC Summer Training 2020 部分补题记录
		
补题地址:https://zjusummer.contest.codeforces.com/ Contents ZJU-ICPC Summer 2020 Contest 1 by Group A Pr ...
 
随机推荐
- 22 Extends 继承(子类、父类)
			
本章主要介绍继承的 概念.方法重写(@Override注解的使用).使用场景.方法的执行顺序 /*1.继承的 概念 * 继承:多个类有共同的成员变量和成员方法,抽取到另外一个类中(父类),在让多个类去 ...
 - String 对象-->toUpperCase() 方法
			
1.定义和用法 将字符串中所有的小写字符转换成大写字符,大写字符保持不变 返回转换后的结果字符串 语法: string.toUpperCase() 注意:不会改变字符串本身,仅以返回值的形式返回结果 ...
 - logger日志级别
			
Level 描述 ALL 各级包括自定义级别 DEBUG 指定细粒度信息事件是最有用的应用程序调试 ERROR 错误事件可能仍然允许应用程序继续运行 FATAL 指定非常严重的错误事件,这可能导致应用 ...
 - java 代码执行cmd 返回值异常  (关于JAVA Project.waitfor()返回值是1)
			
关于JAVA Project.waitfor()返回值是1 0条评论 Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project ...
 - 如何使用python进行自动网上考试
			
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: HIS Hacker PS:如有需要Python学习资料的小伙伴可以 ...
 - Jingwen‘s update
			
Bugs: The checkin button of the question answering page must be pressed twice to check in the result ...
 - 再接再厉,JSONViewer现已支持Firefox、Microsoft Edge、360浏览器,可能是最好用的JSON格式化工具
			
之前写的JSONViewer,截至目前在谷歌商店里已经有1000+的自然下载量了 为什么开发JSONViewer? 日常开发中,拿到接口输出的JSON一般会去在线的JSON格式化网站查看,但是在线格式 ...
 - calculator.py
			
代码如下: #计算器类 class Count: def __init__(self, a, b): self.a = int(a) self.b = int(b) #计算器加法 def add(se ...
 - Nmap-脚本检测CVE漏洞
			
Nmap的一个鲜为人知的部分是NSE,即Nmap Scripting Engine,这是Nmap最强大和最灵活的功能之一.它允许用户编写(和共享)简单脚本,以自动执行各种网络任务.Nmap内置了全面的 ...
 - [linux][nginx] 常用2
			
出现提示"Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address alre"的错误提示. 这 ...