[CF977F]Consecutive Subsequence
题目描述
You are given an integer array of length n.
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 [x,x+1,…,x+k−1] for some value x and length k.
Subsequence of an array can be obtained by erasing some (possibly zero) elements from the array. You can erase any elements, not necessarily going successively. The remaining elements preserve their order. For example, for the array [5,3,1,2,4] the following arrays are subsequences: [3], [5,3,1,2,4], [5,1,4], but the array [1,3] is not.
题目大意
给你n个数的序列,求出最长的连续上升子序列(每个元素之间只差\(1\)),并输出在原序列中的位置。
40分做法
非常容易想到的暴力,我们开\(200000\)个\(vector\),每次在已有的数组中找是否有一个数组的最后一个元素是当前数-1,如果有那么就插入到长度最长的一个,如果没有,那么就新开一个数组来存储新的数列。
40分代码
#include<bits/stdc++.h>
#define LL long long
#define pb push_back
using namespace std;
struct node{int x,p;};
vector<node>ans[200005];//其实可以用vector套vector
int cnt=0,n,len[200005],ret=0,res=0;
LL a[200005];
LL r(){LL x=0,w=0;char ch=0;while(!isdigit(ch))w|=ch=='-',ch=getchar();while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return w?-x:x;}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)a[i]=r();
for(int i=1;i<=n;i++){
int pos=-1;
for(int j=1;j<=cnt;j++)if(ans[j][ans[j].size()-1].x==a[i]-1&&(pos==-1||ans[pos].size()<=ans[j].size()))pos=j;//找到已有的数组,在插入
if(pos==-1)ans[++cnt].pb((node){a[i],i}); else ans[pos].pb((node){a[i],i});//如果没有合法的数组就新开一个。
}
for(int i=1;i<=cnt;i++)if(ret<ans[i].size())ret=ans[i].size(),res=i;
printf("%d\n",ret); for(int i=0;i<ans[res].size();i++)printf("%d ",ans[res][i].p);
return 0;
}
100分做法
其实是非常简单的DP问题,我们用\(F[i]\)表示以\(i\)为结尾的最长的序列,那么转移方程就是:\(F[i]=F[i-1]+1\)。
但是这里的\(F\)数组的下标非常大,那么我们就用\(map\)来映射就可以了。
100分代码
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define N 200005
using namespace std;
int a[N],n;
map<int,int>f;
int r(){int w=0,x=0;char ch=0;while(!isdigit(ch))w|=ch=='-',ch=getchar();while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return w?-x:x;}
int main(){
int cas=r();n=r();
int x=0,Max=0;
for(int i=1;i<=n;i++){
a[i]=r();f[a[i]]=f[a[i]-1]+1;
if(f[a[i]]>Max)Max=f[a[i]],x=a[i];
}
int t=x-Max+1;printf("%d\n",Max);
for(int i=1;i<=n;i++)if(a[i]==t){printf("%d ",i);t++;}
return 0;
}
[CF977F]Consecutive Subsequence的更多相关文章
- Consecutive Subsequence CodeForces - 977F(dp)
Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...
- codeforce 977 F. Consecutive Subsequence
F. Consecutive Subsequence time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- Consecutive Subsequence CodeForces - 977F (map优化DP)·
You are given an integer array of length nn. You have to choose some subsequence of this array of ma ...
- Consecutive Subsequence (DP+map)
You are given an integer array of length nn. You have to choose some subsequence of this array of ma ...
- 最大连续子序列和问题(Maximum Consecutive Subsequence Sum)
该算法的定义是:给出一个int序列,元素有正有负,找出其中的最大连续子序列的和. 例如:-2,11,-4,13,-5-2,:最大和为20(11,-4, 13). 怎么考虑这个问题呢? 要充分利用,连续 ...
- Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)
题目:https://codeforces.com/problemset/problem/977/F 题意:一个序列,求最长单调递增子序列,但是有一个要求是中间差值都是1 思路:dp,O(n)复杂度, ...
- Codeforces 977F - Consecutive Subsequence - [map优化DP]
题目链接:http://codeforces.com/problemset/problem/977/F 题意: 给定一个长度为 $n$ 的整数序列 $a[1 \sim n]$,要求你找到一个它最长的一 ...
- CF 977 F. Consecutive Subsequence
题意: 第一场div3, 求的是一个序列中最长连续(a,a+1,a+2...)子序列. 分析: 设一个DP[i] 表示 序列以i结尾的最长长度, 一开始都设为0. 那么如果这个数是a, 他的最长长度就 ...
- 【Codeforces 977F】Consecutive Subsequence
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 设f[i]表示i作为序列的最后一个数字,最长的连续序列的长度. 用f[i]和f[i-1]+1来转移即可 [代码] import java.io ...
随机推荐
- springBoot项目启动类启动无法访问
springBoot项目启动类启动无法访问. 网上也查了一些资料,我这里总结.下不来虚的,也不废话. 解决办法: 1.若是maven项目,则找到右边Maven Projects --->Plug ...
- Redis使用和部分源码剖析以及Django缓存和redis的关系
0.特点: a.持久化 b.单进程.单线程 c.5大数据类型 d.用于操作内存的软件. e.虽然是缓存数据库但是可以做持久化的工作 MySQL是一个软件,帮助开发者对一台机器的硬盘进行操作 ...
- 如何使用RSS
(转载: http://www.ruanyifeng.com/blog/2006/01/rss.html) 一. 自从我发现很多人不知道什么是RSS以后,我就一直想向大家介绍它,因为它太有用了,将来会 ...
- [转帖]ipvsadm命令参考及其应用例子
ipvsadm命令参考及其应用例子 https://blog.csdn.net/orichisonic/article/details/47375227 只是简单创建了 service和添加serve ...
- HDU 4913 Least common multiple
题目:Least common multiple 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4913 题意:有一个集合s,包含x1,x2,...,xn, ...
- mybatis数据源与连接池
1.概念介绍1.1 数据源:顾名思义,数据的来源,它包含了数据库类型信息,位置和数据等信息,一个数据源对应一个数据库. 1.2 连接池:在做持久化操作时,需要通过数据库连接对象来连接数据库,而连接池就 ...
- (一)类数组对象NodeList
NodeList对象的特点: NodeList是一种类数组对象,用于保存一组有序的节点. 可以通过方括号语法来访问NodeList的值,有item方法与length属性. 它并不是Array的实例,没 ...
- yml中driver-class-name: com.mysql.jdbc.Driver 解析不到的问题
当在idea中使用springboot的快捷创建方式时,选中了mysql 和jdbc 那么pom文件中会直接有 <dependency> <groupId>mysql</ ...
- Spring Boot 框架学习 (一)配置并运行Spring Boot 框架
下载开发工具: 下载完成打开以后,第一步检查环境 查看jdk是否配置: 接着一定要注意,maven通常情况下它是没有给你配置的,要自行配置: 右键新建: 然后依赖选择web.跟Mybatis就行了. ...
- HTML5 & tel & make a phone call
HTML5 & tel & make a phone call 咋呼叫呀,网页怎么打电话? { key: "exploreCorpPhone", title: &q ...