CF977F Consecutive Subsequence (stl)
这道题乍一看是最长上升子序列(其实也是)
但是这里要求是+1的最长上升子序列,我们自然想到由dp[a[i]-1]+1转移过来。但是很坑的是这个数据很大
有1e9,我当时还以为有什么精妙的解法,没想到是利用map进行映射。既然数组存不下,那就用存的下的去存
只要遍历map找到最大的,之后倒着枚举就行了。
#include<iostream> #include<cstring> #include<cstdio> #include<map> #include<algorithm> #include<queue> #define ull unsigned long long using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=5e5+10; const int mod=1e9; map<int,int> m1; int a[N]; int main(){ int n; cin>>n; int i; for(i=1;i<=n;i++){ scanf("%d",&a[i]); m1[a[i]]=max(m1[a[i]],m1[a[i]-1]+1); } int res=0; int id=0; for(auto it : m1){ if(it.second>res){ res=it.second; id=it.first; } } vector<int> num; for(i=n;i>=1;i--){ if(id==a[i]){ num.push_back(i); id--; } } cout<<num.size()<<endl; for(i=(int)num.size()-1;i>=0;i--){ cout<<num[i]<<" "; } cout<<endl; }
没有人不辛苦,只有人不喊疼