大致題意:
有乙個空序列,依次插入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行,...