BZOJ 1500, 維修數列

2021-07-22 15:40:53 字數 992 閱讀 7548

傳送門

編寫乙個支援插入、刪除、修改、翻轉、求和以及求和最大子串行的資料結構。

splay無疑。

但是寫太醜也是會tle的,比方說插入的時候應該以建樹的形式插入,而不是乙個點乙個點的形式。

實現起來要注意的細節很多,對練習打splay挺有好處。

(陸陸續續除錯了好多天,總算在崩潰之前ac了……)

#include

const int n=500005;

int n,m,o,cnt,top,p,t,c,a[n],f[n],son[n][2],val[n],sz[n],sum[n],pre[n],suf[n],mx[n]=,rec[n];

bool rev[n],tag[n];

char op[15];

int max(int a,int b)

void swap(int &a,int &b)

void revl(int

x)void same(int

x,int v)

void read(int &x)

int new(int &x)

void erase(int

x)void up(int

x)void pb(int

x) if(tag[x])

}int kth(int k)

}int build(int l,int r,int fa)

void rotate(int

x)void splay(int

x,int w)

rotate(x);

}if(!w) o=x;

up(x);

}int main()else

if(op[2]=='l')else

if(op[2]=='k')else

if(op[2]=='v')else

if(op[2]=='t')else

}return

0;}

BZOJ 1500 維修數列

time limit 10 sec memory limit 64 mb submit 14433 solved 4701 submit status discuss 輸入的第1 行包含兩個數n 和m m 20 000 n 表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初...

bzoj 1500 維修數列

輸入的第1 行包含兩個數n 和m m 20 000 n 表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的 任何時刻數列中最多含有500 000個數,數列中任何乙個數字均在 1 000,1 000 內。插入的數字總數不...

BZOJ1500 維修數列 splay

orz hzwer.lx x 表示x的子樹的中序遍歷的最左節點開始向右的最大和,可以在任意地方結束,rx x 表示x這棵子樹的中序遍歷最右節點開始向左的最大和。mx x 是這棵子樹的最大值,這樣就很好維護了。tag x 是這棵子樹被全部賦值的標記,rev x 是這棵子樹被反轉的標記 include ...