最長増加部分列

lis_sizeで最長部分増加列の長さ

los_posでそれぞれの位置までの最長増加部分列の長さが記録されたvectorが帰っってくる


    int lis_size(vector<int> v){
        vector<int> dp;
        int n = v.size();
        for(int i : v){                
            auto it = lower_bound(dp.begin(),dp.end(),i);
            if(it == dp.end())dp.push_back(i);
            else *it = i;
        }
        return dp.size();
    }
    vector<int> lis_pos(vector<int> v){
        vector<int> dp;
        int n = v.size();
        vector<int> ans(n);
        for(int j = 0;j < n;j++){
            int i = v[j];
            auto it = lower_bound(dp.begin(),dp.end(),i);
            if(it == dp.end()){
                dp.push_back(i);
                ans[j] = dp.size();
            }
            else{
                *it = i;
                ans[j] = (it - dp.begin())+1;
            }
        }
        return ans;
    }