题目链接:点击打开链接
题目大意:给你一个长度为n的序列,求逐步递增的最长子序列,即为x,x+1,x+2,x+3......
子序列:即删掉原序列的某些元素,但元素的顺序不发生变化。
输出子序列的长度,和子序列中元素的下标。
思路:用map来记录即可 map记录的是从开始到这个元素,最长的子序列长度。
遍历原数组,对于元素x,查询mp【x-1】的子序列长度,元素x的最长子序列长度为mp【x】=mp【x-1】+1.
最后通过求出的最大数,遍历输出即可。
#include <bits/stdc++.h>
using namespace std;
#define maxn 300000
#define LL long long
map<int,int >mp;
int n,m;
int a[maxn];
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
int mine=-1,pos;
for(int i=0;i<n;i++)
{
mp[a[i]]=mp[a[i]-1]+1;
if(mp[a[i]]>mine)
{
mine=mp[a[i]];
pos=a[i];
}
}
int first=pos-mine+1;
printf("%d\n",mine);
for(int i =0;i<n;i++)
{
if(a[i]==first)
{
printf("%d ",i+1);
first++;
}
}
return 0;
}