[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 ...
随机推荐
- 解决ImportError: cannot import name 'webdriver' from 'selenium' (C:\Users\Mr.Su\PycharmProjects\***\venv\selenium.py)
报错信息如下图所示: 解决方案:将项目根目录下的自己创建的selenium.py文件重命名.
- react render
实际上react render方法返回一个虚拟dom 并没有去执行渲染dom 渲染的过程是交给react 去完成的 这就说明了为什么要在所有数据请求完成后才去实现render 这样做也提高了性能.只调 ...
- oracle创建表空间、创建用户、授权角色和导入导出用户数据
使用数据库管理员身份登录 -- log as sysdba sqlplus / as sysdba; 创建临时表空间 -- create temporary tablespace create tem ...
- tomcat启动的时候报错Failed to start component
在idea中运行tomcat时,遇到异常,异常信息如下: 16-Jan-2018 16:33:37.325 信息 [localhost-startStop-1] org.apache.catalina ...
- [转帖]SPU、SKU、ID,它们都是什么意思,三者又有什么区别和联系呢?
SPU.SKU.ID,它们都是什么意思,三者又有什么区别和联系呢? http://blog.sina.com.cn/s/blog_5ff11b130102wx0p.html 电商时代,数据为王. 所以 ...
- python语法糖/装饰器
1.python高阶函数和嵌套函数 1.1高阶函数 def func1(x): return x**2 def func2(x): return x**3 def func(x,y): return ...
- WPF实现滚动显示的TextBlock
在我们使用TextBlock进行数据显示时,经常会遇到这样一种情况就是TextBlock的文字内容太多,如果全部显示的话会占据大量的界面,这是我们就会只让其显示一部分,另外的一部分就让其随着时间的推移 ...
- QTP 自动货测试桌面程序-笔记(添加控件仓库并关联到action)
录制或编写脚本前先添加行为对应的控件仓库: 心得:多个测试action使用的同一个窗体的仓库单独放于一个仓库中,可以在多个action中添加关联使用 将同一个窗体的控件只放于一个仓库中,减少使用时的名 ...
- 一个好玩的小制作,以及在<a/>中的标签href="javascript:;"/href="javascript:void(0);"/href="javascript:"的用法
一:一个小图标的制作 我们在支付宝.微信等某些地方上传文件时会遇到以下的图标,但是这样的图标其实可以用<a/>标签以及css样式完成, 具体代码如下: <!DOCTYPE html& ...
- How to recovery compiz
sudo apt install compizconfig-settings-manager dconf reset -f /org/compiz/ setsid unity dconf list / ...