Loading

最长上升子序列部分变形题总结

T1 老司机的狂欢

这道题原来在博客里面写过,第一问是二分找到最长上升子序列的满足老司机个数的时间

第二问认为是个比较经典的题目,以后应该当板子用。

就是求出字典序最小的最长上升子序列。

使用pair类型的树状数组,记录一个$val$,记录一个$id$

然后使用倍增思想建树以及查询,精髓在于一个miin比较函数

inline bool miin(pii a,pii b){
    if(a.first!=b.first) return a.first<b.first;
    int mina=a.second,minb=b.second;
    int x=a.second,y=b.second;
    for(int i=20;i>=0;i--){
        if(fa[x][i]!=fa[y][i]){
            mina=min(mina,minn[x][i]);
            minb=min(minb,minn[y][i]);
            x=fa[x][i]; y=fa[y][i];
        }
    }
    return mina>minb;
}
函数

在这个函数里实现了维护最小编号以及返还值

写好这个函数以后就可以按照正常的树状数组求最长上升子序列的长度

然后通过跳爹找到整条子序列。

详情见我的博客

T2 降雷皇

这一次的考试题解还没有写,最近总是不大行

(不过今天还好,毕竟有时间写题解了,论为何报零的话就问为什么智障没关freopen。。。。)

所以这题还没写题解。。

在这里先简单说说

第一问直接树状数组干掉,第二问考场上打的dfs,没错,参数0写成1给假了。。。

就直接挂掉了。。。

第二问是个经典的求最长上升子序列个数问题,精髓在于一个max返回

树状数组继续用struct 或者pair ,记录数量和长度

显然只有当长度相等的时候才可以向更长的序列转移

所以直接在两个串长度相等时将其sum相加,其他的就跟简单的求最长上升子序列一样了

inline node max(node a,node b){return a.len==b.len? ((node){a.len,(a.num+b.num)%123456789}):(a.len>b.len?a:b);}
直接一行,三目套三目

认为自己最长上升子序列掌握的可以了,如果以后还有什么新的变形还会更新。。。。(啾咪!)

posted @ 2021-07-29 17:41  雪域亡魂  阅读(125)  评论(0)    收藏  举报