NOI2005 維護數列

2022-06-04 10:51:12 字數 2212 閱讀 2322

點這裡看題目。

思路大概就是那樣:平衡樹加花式 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 來說不在話下,只要多打兩個標記就可以了。但是如何求最大子段和?於是乎我們再打三個標記來維護它 霧 然後我們...