/**
[划分树] poj 2104
划分树定义为,
她的每一个节点保存区间 [lft,rht ]所有元素,
元素排列顺序与原数组(输入)相同,但是,
两个子树的元素为该节点所有元素排序后(mid - lft + 1)个进入左子树,其余的到右子树,
同时维护一个num域,num[i] 表示[lft,i]这些点有多少进入了左子树。
真实的树由深度和区间存储
*/
#include <stdio.h>
#include <algorithm>
#define N 100001
int sum[20][N],tr[20][N],sor[N];
void build(int l,int r,int d)
{
if(l == r)
return ;
int mid = (l + r) >> 1,i,lp = l,rp = mid + 1;
for(i = l; i <= r; ++i)
{
sum[d][i] = sum[d][i-1];
if(tr[d][i] <= sor[mid] && lp <= mid) //放到左子树
tr[d+1][lp++] = tr[d][i],++sum[d][i];
else
[划分树] poj 2104
最新推荐文章于 2019-06-16 00:11:50 发布
这篇博客介绍了划分树数据结构的定义和实现,通过一个具体的例子展示了如何使用划分树来解决POJ 2104问题。在划分树中,每个节点保存一个区间,并根据特定规则将元素分配到左右子树,同时维护一个num域记录信息。文章通过C++代码展示了如何构建划分树以及进行区间查询操作。
摘要由CSDN通过智能技术生成