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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/ctyakwf/p/12629113.html