归并树一题

原创 2013年12月04日 14:07:45

个人感觉相对划分树而言,归并树是基于归并排序的分治思想(归并排序也可以快速求逆序数)

归并树 hdu4417Super Mario (求给定数在给定区间的中比它小的数的个数,或大小位置)(求逆序数)

typedef long long LL;
typedef unsigned long long ULL;
typedef vector <int> VI;
const int INF = 1000000000;
const int maxn = 100010;
const int deep = 20;
 
//#define lson l, m, rt << 1, dep + 1
//#define rson m + 1, r, rt << 1 | 1,dep + 1
///可以不用 rt
 
#define lson l, m, dep + 1
#define rson m + 1, r, dep + 1
 
int t[deep][maxn];///tree[deep][maxn]///隐式线段树
int n;
int ans;
 
void build(int l, int r, int dep)///建立树///dep 从1开始
{
   for (int i = l; i <= r; i++) t[dep][i] = t[dep - 1][i];///复制到下面
   if (l == r) return ;///必须放到后面
   int m = (l + r) >> 1;
   build(lson);
   build(rson);
   sort(t[dep] + l, t[dep] + r + 1);///排序
}
 
///二分
int solve(int be, int ed, int x, int dep)
{
   int *num = t[dep];///技巧
   int l = be, r = ed, m;
   while (l <= r)
    {
       m = (l + r) >> 1;
       if (num[m] > x)///
            r = m - 1;
       else l = m + 1;
    }
   return l;
}
 
void query(int L, int R, int h, int l, intr, int dep)
{
   if (L <= l && r <= R)
    {
       int u = solve(l, r, h, dep);
       ans += u - l;
       return;
    }
   int m = (l + r) >> 1;
   if (m >= L) query(L, R, h, lson);
   if (m < R) query(L, R, h, rson);
}
 
int main()
{
   int x, y, z;
   int T;
   int p = 1;
   RI(T);
   while (T--)
    {
       printf("Case %d:\n",p++);
       CLR(t, 0);///用初始化吗
       int m;
       RII(n, m);
       FE(i, 1, n)///1开始
           RI(t[0][i]);
 
       build(1, n, 1);///根为第1层
 
       while (m--)
       {
           RIII(x, y, z);
           x++;
           y++;
           ans = 0;
           query(x, y, z, 1, n, 1);///根为第1层
           printf("%d\n",ans);
       }
    }
}
 


个人感觉相对划分树而言,归并树是基于归并排序的分治思想(归并排序也可以快速求逆序数)

k路归并(败者树,记录败者)

k路归并(败者树,记录败者) 分类: algorithm2013-09-15 16:33 102人阅读 评论(0) 收藏 举报 多路归并外排序败者树       败者树在外排...
  • pi9nc
  • pi9nc
  • 2013年09月15日 21:51
  • 4511

递归树求递归算法时间复杂度

递归算法时间复杂度的计算方程式一个递归方程:      在引入递归树之前可以考虑一个例子:   T(n) = 2T(n/2) + n2   迭代2次可以得:   T(n) = n2 + 2(...
  • mingzhentanwo
  • mingzhentanwo
  • 2015年01月19日 11:11
  • 1674

Java实现二叉树的创建、递归/非递归遍历

最近复习数据结构中的二叉树的相关问题,在这里整理一下 这里包括: 1、二叉树的先序创建 2、二叉树的递归先序遍历 3、二叉树的非递归先序遍历 4、二叉树的递归中序遍历 5、二叉树的非递归中序遍历 6、...
  • u010829118
  • u010829118
  • 2014年08月10日 16:21
  • 2602

每日一题(92) - 归并排序

题目来自网络 题目(1):基于数组的归并排序 题目(2):基于链表的归并排序 ---------- 题目(1):基于数组的归并排序 思路:借助分治的思想,总是先对待排序进行分割,之后再对两个子...
  • insistGoGo
  • insistGoGo
  • 2013年09月11日 13:03
  • 691

每日一题9:字典树(一)

百科上对于字典树的定义是:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优...
  • liao_jian
  • liao_jian
  • 2015年03月26日 23:28
  • 412

每日一题(22)——区间重合检测(二)(线段树)

一、问题:给定一个窗口区域和系统界面上的N个窗口,判断这个窗口区域是否被已有的窗口覆盖。   二、数据结构之线段树 作者:Dong |可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版...
  • sangni007
  • sangni007
  • 2012年12月06日 00:38
  • 2257

递归一题三解-将二分查找树(BST)转化成循环双链表(DLL)

题目来自leetcode: 已知一个BST(binary search tree), 将其原地转化成一个循环的排序过的双链表(circular sorted double linked list)。 ...
  • teaspring
  • teaspring
  • 2014年01月03日 12:09
  • 1548

每日一题29:最小生成树

最小生成树是指包含图中所有的顶点而又没有环并且所有边的权值最小的子图,由于这张图没有环,所以就是一棵树。比较流行的两种找到最小生成树的算法有Kruscal算法和Prim算法。本文在代码注释里写明算法的...
  • liao_jian
  • liao_jian
  • 2015年05月29日 08:23
  • 616

每日一题之实现二叉树的前序/中序/后序非递归遍历

如图所示: 前序遍历:先访问根节点,再访问左子树,最后访问右子树,上图所示的前序遍历是:8,6,5,7,10,9,11. 中序遍历:先访问左子树,再访问根节点,最后访问右子树,上图所示的中序遍历是...
  • flybeatles
  • flybeatles
  • 2017年07月28日 22:12
  • 131

每日一题25:Hoffman树

Hoffman树是由David A. Hoffman于1952年在MIT攻读博士学位期间发表的论文《A Method for the Construction of Minimum-Redundanc...
  • liao_jian
  • liao_jian
  • 2015年05月19日 15:45
  • 481
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:归并树一题
举报原因:
原因补充:

(最多只允许输入30个字)