笛卡尔树

变量

  • int a[i]\texttt{int a[i]}:节点 ii 的键值。
  • int ls[i]\texttt{int ls[i]}:节点 ii 的左儿子的编号。
  • int rs[i]\texttt{int rs[i]}:节点 ii 的右儿子的编号。
  • int z[i]\texttt{int z[i]}:栈的第 ii 个位置的值。
  • int top\texttt{int top}:栈顶的位置。

函数

  • void build(int n)\texttt{void build(int n)}:根据现有的 aia_i 建立笛卡尔树,一般在所有的 aia_i 都存入后使用。

代码

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;
posted @ 2022-08-03 11:00  luckydrawbox  阅读(28)  评论(0)    收藏  举报  来源