/**
[划分树] 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 发布