传送门:bzoj1500
题解
splay模板题,推荐一篇题解。
一些注意事项:
1.t[0].mx=v[1]=v[n+2]=-inf
,在 p u s h u p pushup pushup时会和子节点的 m x mx mx取 m a x max max,最后答案可能为负,所以要设为 − i n f -inf −inf。
2.st=inf
,赋值标记要初始化为一个不在值域范围 [ − 1000 , 1000 ] [-1000,1000] [−1000,1000]内的数
3.pushup(y);pushup(x);
每次操作完记得 p u s h u p pushup pushup
4.数据点数过多,需要存内存池动态维护标号。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,m,v[N];
char cmmd[50],cc;
char cp;
inline void rd(int &x)
{
cp=getchar();x=0;int f=0;
for(;!isdigit(cp);cp=getchar()) if(cp=='-') f=1;
for(;isdigit(cp);cp=getchar()) x=(x<<3)+(x<<1)+(cp^48);
if(f) x=-x;
}
namespace BST{
#define lc(x) t[(x)].ch[0]
#define rc(x) t[(x)].ch[1]
#define F(x) t[(x)].fa
int rt,stk[N],top;
struct node{
int ch[2],fa,rv,st,sz;
int lx,rx,mx,sum,val;
inline void itia(){
ch[0]=ch[1]=fa=rv=0;}
inline void mk(int x)