1. 程式人生 > 其它 >最長上升子序列部分變形題總結

最長上升子序列部分變形題總結

T1 老司機的狂歡 T2 降雷皇

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);}
直接一行,三目套三目

認為自己最長上升子序列掌握的可以了,如果以後還有什麼新的變形還會更新。。。。(啾咪!)