int n,l[maxn],r[maxn],vis[maxn],stk[maxn];
pair<int,int>a[maxn];
void build()
{
int top=0;
for ( int i=1 ; i<=n ; i++ )
l[i]=0,r[i]=0,vis[i]=0;
for ( int i=1 ; i<=n ; i++ )
{
int k=top;
while ( k>0&&a[stk[k-1]]>a[i] )
k--;
if ( k )
r[stk[k-1]] = i;
if ( k<top )
l[i] = stk[k];
stk[k++] = i;
top = k;
}
for ( int i=1 ; i<=n ; i++ )
vis[l[i]] = vis[r[i]] = 1;
int rt = 0;
for ( int i=1 ; i<=n ; i++ )
if ( vis[i]==0 )
rt = i;
}
本文深入探讨了区间树的构建过程,通过初始化数组并利用栈结构进行遍历,实现了节点间的左右连接,确保了每个节点都有对应的左边界和右边界。最后,通过遍历验证每个节点的有效性,确定了根节点,为后续的区间查询和更新操作奠定了基础。
347

被折叠的 条评论
为什么被折叠?



