bzoj3173 Splay 維護字首中的最大值

2022-06-02 13:09:07 字數 1301 閱讀 9355

大致題意:

有乙個空序列,依次插入1~n到該序列中,每次指定插入的位置,每次插入完成返回當前序列的lis的長度。

題解:設dp[i]表示 字首1~i的最長上公升子串行的長度。

因為是按照遞增順序插入的,所以當剛插入完某個數到i位置(此時能保證該數是當前序列的最大值)dp[i] = max

**:

1 #include 2 #include 3

#define maxn 100010

4using

namespace

std;56

struct

splay

13void update( int

nd )

17void rotate( int nd, int

d )

34void splay( int nd, int

top ) else

else50}

51}52}

53int find( int pos ) else

if( pos>=ls+2

) else65}

66}67int premax( int

pos ) else

if( pos>=ls+2

) else82}

83return

rt;84}85

int newnode( int p, int

v )

93void insert( int

pos )

98if( pos==0

) 106

int nd =find( pos );

107int nw = newnode( nd,premax(pos)+1

);108

int s = son[nd][1

];109 son[nd][1] =nw;

110 son[nw][1] =s;

111 pre[nw] =nd;

112if( s ) pre[s] =nw;

113 update( son[nd][1

] );

114update( nd );

115 splay( nd, 0

);116

}117

void print( int

nd )

123};

124125

splay t;

126int

n;127

intmain()

137 }

BZOJ 3729 splay維護DFS序 博弈論

思路 這像是 階梯nim之類的東西 我們 直接把sg函式 設成mod l 1 的 一棵子樹 向下的奇數層上的石子xor起來 就是答案 有加點和改值的操作 就splay維護一下 by siriusren include include include using namespace std const...

uva 11922 splay維護數列

splay第一題,有了treap的基礎以後感覺splay還是比較好理解的,splay的優勢在於程式設計複雜度比較低且效率不錯,通過splay操作以及衍生的split和merge操作可以實現很強大的功能。1 include 2 include 3 include 4 using namespace s...

bzoj 3173 最長上公升子串行

給定乙個序列,初始為空。現在我們將1到n的數字插入到序列中,每次將乙個數字插入到乙個特定的位置。每插入乙個數字,我們都想知道此時最長上公升子串行長度是多少?第一行乙個整數n,表示我們要將1到n插入序列中,接下是n個數字,第k個數字xk,表示我們將k插入到位置xk 0 xk k 1,1 k n n行,...