BZOJ 1500 維護序列

2022-05-13 10:12:53 字數 1621 閱讀 6102

bzoj 1500 傳送門

可能平衡樹維護序列的所有操作都在這了吧……

對序列的維護$fhq treap$和$splay$都能做

有幾個注意點:

1、維護序列時始終記得第$k$大指的是序號,與權值無關

2、注意對0的初始化,畢竟如果無葉子結點時會用到

3、如果資料總量過大要資料**,用佇列記錄被刪除的節點,同時記得將兒子資訊初始化!

4、如果求最大子串行和,一般要維護$lmx,rmx$來求解

如果同時還有翻轉操作,記得將$lmx$和$rmx$也要翻轉!

6、對$treap$的初始化時並不需要基於隨機的旋轉操作,直接構造就好了

要明白隨機的旋轉目的是為了保證期望樹高,如果已經構造得最優了自然不必旋轉了

#include using

namespace

std;

#define x first

#define y second

#define lc s[x][0]

#define rc s[x][1]typedef

long

long

ll;typedef pair

p;const

int maxn=5e5+10,inf=1

<<30

;char op[20];queueq;

intspin[maxn],cov[maxn],sum[maxn],mx[maxn],lmx[maxn],rmx[maxn];

int rt,n,m,num,cnt,dat[maxn],s[maxn][2

],pri[maxn],sz[maxn],val[maxn];

int newnode(int

x)void rotate(int

x)void modify(int x,int

k)void pushdown(int

x)

if(cov[x]!=inf)

spin[x]=0;cov[x]=inf;

}void pushup(int

x)int build(int l,int

r)void split(int x,int k,int &a,int &b)

pushdown(x);

if(k<=sz[lc]) b=x,split(lc,k,a,lc);

else a=x,split(rc,k-sz[lc]-1

,rc,b);

pushup(x);

}int merge(int x,int

y)

else

}void reuse(int

x)int

main()

else

if(op[1]=='d'

)

else

if(op[3]=='k'

)

else

if(op[1]=='r'

)

else

if(op[1]=='g'

)

else printf("

%d\n

",mx[rt]);

}return0;

}

BZOJ 1500 洛谷2042維護序列題解

bz鏈結 洛谷鏈結 這道題真是喪心病狂。應該很容易就可以看出做法,但是寫 寫的.思路很簡單,用乙個平衡樹維護一下所有的操作就好了,重點講解一下 的細節 首先如果按照常規寫法的話,splay的節點要開到4000000,直接炸飛,由於任意時刻splay中的節點最多只有500000個,我們只需要開5000...

bzoj1500維修序列(splay)

感覺已經是乙個很好的模版了,手機上再理順一下思路,明天寫個思路清晰,清楚的 更新 感覺這次的 真是決了,絕對優美通俗易懂的 風格 不過 長難免bug多,還是要練 能力的 include include include include include define debug x cout x 9 i...

NOI 2005 BZOJ 1500 維護數列

這道算是一道合格的splay基礎題。距離上一次那道簡單的splay時間比較長,因為經歷了元旦晚會和之後的乙個小假期沒寫題。這道題涵蓋的splay的操作還是比較多的,適合練手。寫的時候思路一定要清晰,否則不好調。推薦自頂向下寫。我就是先寫的最大的框架,判斷輸入,呼叫哪個函式。寫出大框架之後就輪到挨個寫...