变量
- int a[i]:节点 i 的键值。
- int ls[i]:节点 i 的左儿子的编号。
- int rs[i]:节点 i 的右儿子的编号。
- int z[i]:栈的第 i 个位置的值。
- int top:栈顶的位置。
函数
- void build(int n):根据现有的 ai 建立笛卡尔树,一般在所有的 ai 都存入后使用。
代码
struct Dicar{
int a[N],ls[N],rs[N];
int z[N],top;
void build(int n){
top=0;
memset(ls,0,sizeof(ls));
memset(rs,0,sizeof(rs));
for(int i=1;i<=n;i++){
int tmp=top;
while(tmp&&a[z[tmp]]>a[i])
tmp--;
if(tmp)
rs[z[tmp]]=i;
if(tmp<top)
ls[i]=z[tmp+1];
z[++tmp]=i;
top=tmp;
}
}
}tree;