傳送門
編寫乙個支援插入、刪除、修改、翻轉、求和以及求和最大子串行的資料結構。
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 ...