关于Consecutive Subsequence的题解
题目描述:
给定一个长度为n的整数数组。 你必须选择这个最大长度数组的某个子序列这样这个子序列就形成了一个递增的连续整数序列。换句话说,对于某个值x和长度k,所需的序列应该等于[x,x+1,…, x+k - 1]。 数组的子序列可以通过擦除数组中的一些(可能为零)元素来获得。你可以擦掉任何元素,不一定是连续的。其余元素保持它们的顺序。例如,对于数组[5,3,1,2,4],以下数组是子序列:[3],[5,3,1,2,4],[5,1,4],但是数组[1,3]不是。
第一部分:算出最长上升子序列
一个DP就可以(我就不放代码了)
第二部分:倒序输出
这一部分中我们知道最长上升子序列的结尾last和长度len。
就能知道开始的左边num = last - len + 1。
之后倒过来输出就行。
我也不放代码了(就是懒 )
总体代码如下:
#include<bits/stdc++.h>
using namespace std;
map<int, int> mk;
int a[200005];
int main(){
int n,maxx=0,last;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
mk[a[i]]=mk[a[i] - 1] + 1;
if(maxx<mk[a[i]]){
maxx=mk[a[i]];
last=a[i];
}
}
cout<<maxx<<endl;
int num=last-maxx+1;
for(int i=1;i<=n;i++){
if(a[i]==num){
cout<<i<<" ";
num++;
}
}
return 0;
}
//freopen("ans.in","r",stdin);
//freopen("ans.out","w",stdout);
(本人代码习惯不太好,将就着看吧)