CF 977 F. Consecutive Subsequence

题意:

第一场div3, 求的是一个序列中最长连续(a,a+1,a+2...)子序列。

分析:

设一个DP[i] 表示 序列以i结尾的最长长度, 一开始都设为0。

那么如果这个数是a, 他的最长长度就是 Dp[a-1] + 1, 最后找出最大那个值就是答案, 倒回去输出序列就可以了

#include <bits/stdc++.h>
using namespace std;
const int maxN = 2e5 + 7;
int a[maxN];
map<int, int> dp;
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    int maxCnt = -1, last;
    for(int i = 1;i <= n; i++){
        int temp;
        cin >> temp;
        a[i] = temp;
        dp[temp] = dp[temp-1] + 1;
        if(dp[temp] > maxCnt){
            maxCnt = dp[temp];
            last = temp;
        }
    }
    cout << maxCnt << "\n";
    int b = last;
    vector<int> ans;
    for(int i = n; i >= 1; i--){
        if(a[i] == last){
            ans.push_back(i);
            last--;
        }
    }
    reverse(ans.begin(), ans.end());
    for(int i = 0; i < ans.size(); i++){
        cout << ans[i] << ‘ ‘;
    }
}

原文地址:https://www.cnblogs.com/Jadon97/p/9005890.html

时间: 2024-10-30 21:20:38

CF 977 F. Consecutive Subsequence的相关文章

codeforce 977 F. Consecutive Subsequence

F. Consecutive Subsequence time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given an integer array of length nn. You have to choose some subsequence of this array of maximum length

Consecutive Subsequence (DP+map)

You are given an integer array of length nn. You have to choose some subsequence of this array of maximum length such that this subsequence forms a increasing sequence of consecutive integers. In other words the required sequence should be equal to [

CF 494 F. Abbreviation(动态规划)

题目链接:[http://codeforces.com/contest/1003/problem/F] 题意:给出一个n字符串,这些字符串按顺序组成一个文本,字符串之间用空格隔开,文本的大小是字母+空格的个数.在这个文本中找k(k>=2)个区间,使得这k个区间完全相同,字符串不能分开,然后把每段的字符串变成单个的字符,并去掉中间的空格.可能有多种方案,求文本的最小长度.[表达能力有限,望理解,具体可以看题目] You are given a text consisting of nn space

【Cf #502 F】The Neutral Zone

本题把$log$化简之后求得就是每个质数$f$前的系数,求系数并不难,难点在于求出所有的质数. 由于空间限制相当苛刻,$3e8$的$bitset$的内存超限,我们考虑所有的除了$2$和$3$以外的质数,他们可以被表示成$p \equiv \pm 1 (mod \; 6) $.(具体来讲就是把数表示成$6k, 6k+1, 6k+2, 6k+3, 6k+4, 6k+5$,显然只有余数为$1$或$5$才有成为质数的可能性).然后我们需要筛的个数就变成原来的三分之一了. 另一个做法:分块,一部分一部分筛

CF - 1117 F Crisp String

题目传送门 题解: 枚举非法对. 如果 ‘a'  和 ’b' 不能相邻的话,那么删除 'a' 'b'之间的字符就是非法操作了. 假设题目给定的字符串为 "acdbe",所以删除cd是非法操作, 因为cd是非法了,所以cde也是非法操作, 也就是说找到所有的非法操作之后往外推,比他多删的状态就一样是非法的了,当然对于上述的“acdbe"来说,不能确定 ”acd"是非法操作,因为在枚举非法对的时候,该非法对的字符并不能被删除. 然后把所有非法对的非法状态都存下来.然后从

树的直径| CF#615Div3 F. Three Paths on a Tree

F. Three Paths on a Tree 思路 两种方法: 1.两次bfs求树的直径,顺便求出一个直径端点到所有点的最短距离:再bfs一次,求另一个直径上的端点到其它所有点的最短距离:之后枚举第三个端点(不等于端点1和端点2),dis(a,b) + dis(b,c) + dis(a,c) 再除以 2 就是最终答案,因为每个路径走了两次所以除以2. 2.dfs求树的直径,记录直径上的所有点.从直径上的所有点去搜索它们到不在直径上的点的最远距离.最后直径+这个最远距离就是答案 代码1 bfs

最大连续子序列和问题(Maximum Consecutive Subsequence Sum)

该算法的定义是:给出一个int序列,元素有正有负,找出其中的最大连续子序列的和. 例如:-2,11,-4,13,-5-2,:最大和为20(11,-4, 13). 怎么考虑这个问题呢? 要充分利用,连续,这个条件. 连续子序列的和可能为正,也可能为负.如果为正,那么我们要继续加下去,因为如果后面一个数是正数, 最大子序列和必定包括前序列的和(毕竟前者和为正),如果后面一个是负数,我们也加,直到子序列的和不为正为止. 因为它不为正,所以如果后面有更大的连续子序列,那么也不会包括它,因为加上一个非正数

CF 474/F, 线段树 + 一点数学

啊回家真是颓,一周了什么都没做 题目大意:给出一坨数,每次询问区间当中有多少个数能把其他区间内的所有数整除 解:由于我是知道这个是线段树专题,所以一开始就奔着gcd去了,想了一下还真是gcd,因为如果一个数a能整除另一个数b,那么gcd(a,b)一定为a,所以这说明可以做区间加法,直接上线段树就是,询问个数的时候还傻叉地想了一会,后面发现给每个线段记一下当前线段表示的gcd有几个就行,合并直接合并(可以证明现在这个线段的gcd一定是作为最优的取值,因为没有数等于这个gcd说明没有数能整除当前区间

LeetCode 659: Split Array into Consecutive Subsequence

Note: 1. If it does not belong any sequences : append.getOrDefault(num, 0) == 0, create a new sequence. It requires num + 1 and num + 2 count > 0. 2. Once it has sequence, move sequece to num + 1. class Solution { public boolean isPossible(int[] nums