點這裡看題目。
思路大概就是那樣:平衡樹加花式 tag ,求最大子段和的方法都是老方法了。
寫一些細節:
常用的方法是把要維護的統一的資訊給封裝起來,這樣可以過載運算子方便編寫。
插入一大段序列的時候,使用 splay 可以快速地建樹,但是在 treap 裡面有(小根)堆性質的限制,因此如果暴力建樹就是 \(o(\sum l\log_2 l)\) 的。為了加速這一過程,我們可以嘗試根據樹形構造出輔助值,即在遞迴建樹的時候,取左右兒子的較小值並再減去乙個隨機值。雖然隨機值會相對醜一些,但是的確會快一些。
#include #include #define rep( i, a, b ) for( int (i) = (a) ; (i) <= (b) ; (i) ++ )
#define per( i, a, b ) for( int (i) = (a) ; (i) >= (b) ; (i) -- )
const int inf = 1e3 + 1;
const int maxn = 5e5 + 5, lim = 4.5e6 + 5;
templatevoid read( _t &x )
while( s >= '0' && s <= '9' )
x *= f;
}templatevoid write( _t x )
if( 9 < x )
putchar( x % 10 + '0' );
}template_t max( const _t a, const _t b )
template_t min( const _t a, const _t b )
struct data
data( const int nval )
data& operator += ( const data &b )
data operator + ( const data &b ) const };
int seq[maxn], len; // ðòáðµä»º´æ
int stk[maxn], top; // äú´æ»øêõõ¾
data dat[maxn]; int val[maxn]; // õâàïêçê÷µäöµðåï¢
int ch[maxn][2], siz[maxn], aux[maxn], rt, tot; // õâàïêçê÷µä½á¹¹ðåï¢
int same[maxn]; bool rev[maxn]; // õâàïêçê÷µä±ê¼çðåï¢
int n, m;
int alloc( const int nval )
void upt( const int x )
void reverse( const int x )
void cover( const int x, const int v )
void normalize( const int x )
/*<---------- here is a thin line between the tag operations(above) and the structural operations(below) ---------->*/
void splitrnk( const int u, const int k, int &x, int &y )
int merge( const int u, const int v )
// ð¡¸ù¶ñºï²¢
int build( const int l, const int r )
void remove( const int x )
/*<---------- here is a thin line between the basic operations(above) and the required operations(below) ---------->*/
void print( const int x )
#define show ( print( rt ), putchar( '\n' ) )
void insert()
void delete()
void makesame()
void sreverse()
int getsum()
int maxsum()
int main()
return 0;
}
noi2005維護數列
請寫乙個程式,要求維護乙個數列,支援以下 6 種操作 請注意,格式欄 中的下劃線 表示實際輸入檔案中的空格 操作編號 輸入檔案中的格式 說明1.插入 insert posi tot c1 c2 c tot 在當前數列的第 posi 個數字後插入 tot 個數字 c1,c2,c tot 若在數列首插 ...
NOI2005 維護數列
陳年老題。我就 碼了4k多。主要就是用splay,然後處理區間上的東西 區間反轉就和模板一樣,但是要記得反轉leftmax和rightmax 區間賦值就把那個區間提取出來,然後給子樹根打個same標記,表示下面的全一樣。區間求最大子段和就和線段樹的套路一樣。區間插入就先弄好一顆平衡樹,然後把原平衡樹...
NOI2005 維護數列
傳送門 我還是沒有逃過在這道題上debug好久的命運 我是使用 fhq treap 來做的這道題。寫的時候寫的挺爽的 調的時候真難受。首先我們先來說說咋做吧。前5個操作對於 fhq treap 來說不在話下,只要多打兩個標記就可以了。但是如何求最大子段和?於是乎我們再打三個標記來維護它 霧 然後我們...