bzoj 1500 傳送門
可能平衡樹維護序列的所有操作都在這了吧……
對序列的維護$fhq treap$和$splay$都能做
有幾個注意點:
1、維護序列時始終記得第$k$大指的是序號,與權值無關
2、注意對0的初始化,畢竟如果無葉子結點時會用到
3、如果資料總量過大要資料**,用佇列記錄被刪除的節點,同時記得將兒子資訊初始化!
4、如果求最大子串行和,一般要維護$lmx,rmx$來求解
如果同時還有翻轉操作,記得將$lmx$和$rmx$也要翻轉!
6、對$treap$的初始化時並不需要基於隨機的旋轉操作,直接構造就好了
要明白隨機的旋轉目的是為了保證期望樹高,如果已經構造得最優了自然不必旋轉了
#include usingnamespace
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的操作還是比較多的,適合練手。寫的時候思路一定要清晰,否則不好調。推薦自頂向下寫。我就是先寫的最大的框架,判斷輸入,呼叫哪個函式。寫出大框架之後就輪到挨個寫...