划分树简单介绍

我感觉划分树的基本思想是二分和归并排序,分为建树和查询两个部分。

1、建树

  递归建树,以中值为界,将序列划分成左右两部分,直到分到每个点为止。同时,在建树的过程中,记录下每一层进入左区间的数的个数,方便查询时使用。

  注意:保持左右区间中数的相对顺序。

(1)、中值唯一的情况。将小于等于中值的数放到左区间即可。

(2)、中值不唯一的情况。为了防止左区间放了过多的和中值相等的数,导致小于中值的数放不进去,需要先统计小于中值的数有多少个,然后用等于中值的数来补全左区间剩余的位置。

    因此需要一个变量来标记一下可放中值数的个数。

2、查询

  递归查询,判断查询 区间中有多少个进入左区间的数,如果K大于该数,说明所查的数在右区间,否则在左区间。因为该层下一层中左区间的数不全是由所查询区间得出的,还有一部分来自于所查询区间的左侧区间,所以在

进入下一层查询时,应当避开这些无关的数,右区间亦然。

 

具体细节见代码解释:(以 POJ 2104为例)

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<stack>
  8 #include<deque>
  9 #include<map>
 10 #include<iostream>
 11 using namespace std;
 12 typedef long long  LL;
 13 const double pi=acos(-1.0);
 14 const double e=exp(1);
 15 const int N = 100010;
 16 
 17 #define lson i << 1,l,m
 18 #define rson i << 1 | 1,m + 1,r
 19 
 20 int order[N],tree[20][N];
 21 int lgo[20][N];
 22 int ans=0,n;
 23 
 24 bool cmp(int a,int b)
 25 {
 26     return a<b;
 27 }
 28 
 29 void build(int ceng,int l,int r)
 30 {
 31 
 32     if(l==r)
 33         return ;
 34 
 35     int i,p,j;
 36     int le,ri,flag=0,mid;      //flag存储该进入左区间的中值的个数
 37     mid=(l+r) >> 1;
 38 
 39     flag=mid-l+1;                       //改的地方  左区间所能存的数的个数
 40     for(i=l;i<=r;i++)
 41         if(tree[ceng][i]<order[mid])    //改的地方  左区间中应存有的中值的个数
 42             flag--;
 43 
 44     le=l;
 45     ri=mid+1;
 46     for(i=l;i<=r;i++)
 47     {
 48         if(i==l)
 49             lgo[ceng][i]=0;
 50         else
 51             lgo[ceng][i]=lgo[ceng][i-1];    //记录有多少个数进入左区间
 52 
 53         if(tree[ceng][i]<order[mid]||(tree[ceng][i]==order[mid]&&flag>0))
 54         {
 55             tree[ceng+1][le++]=tree[ceng][i];
 56             lgo[ceng][i]++;
 57             if(tree[ceng][i]==order[mid])
 58                 flag--;
 59         }
 60         else
 61         {
 62             tree[ceng+1][ri++]=tree[ceng][i];
 63         }
 64     }
 65 
 66     build(ceng+1,l,mid);
 67     build(ceng+1,mid+1,r);
 68 }
 69 
 70 void query(int l,int r,int ql,int qr,int ceng,int k)
 71 {
 72 
 73     if(l==r)
 74     {
 75         ans=tree[ceng][l];
 76         return ;
 77     }
 78     int lgol,at_left,at_right,ingol;
 79 
 80     int mid=(l+r) >> 1;
 81 
 82     if(ql==l)
 83         lgol=0;
 84     else
 85         lgol=lgo[ceng][ql-1];       //改  查询区间的左侧区间进入左区间的个数
 86     ingol=lgo[ceng][qr]-lgol;       //改  查询区间进入左区间的个数
 87 
 88     if(k<=ingol)
 89     {
 90         at_left=l+lgol;      //有效的左起始位置
 91         query(l,mid,at_left,at_left+ingol-1,ceng+1,k);
 92     }
 93     else
 94     {
 95         at_left=mid+1+ql-l-lgol;    //有效的左起始位置
 96         query(mid+1,r,at_left,at_left+qr-ql+1-ingol-1,ceng+1,k-ingol);
 97     }
 98 }
 99 
100 int main()
101 {
102     int i,p,j,k;
103     int a,b,m;
104     scanf("%d%d",&n,&m);
105     for(i=1;i<=n;i++)
106     {
107         scanf("%d",&tree[0][i]);
108         order[i]=tree[0][i];
109     }
110     sort(order+1,order+1+n,cmp);
111     build(0,1,n);
112     for(j=1;j<=m;j++)
113     {
114         ans=0;
115         scanf("%d%d%d",&a,&b,&k);
116         query(1,n,a,b,0,k);
117         printf("%d\n",ans);
118     }
119 
120     return 0;
121 
122 }

 

转载于:https://www.cnblogs.com/daybreaking/p/9448926.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] 使用css实现霓虹灯效果

[css] 使用css实现霓虹灯效果 <div class"neon">Good evening, and good night!</div>body {display: flex;height: 100vh;justify-content: center;align-items: center;text-align: center;background: black;}.neon {color: #cce7f8;font-size: 2.5re…

JZOJ5776. 【NOIP2008模拟】小x游世界树

题目&#xff1a;【NOIP2008模拟】小x游世界树&#xff1b; 题目的附加题解给的很清楚&#xff0c;这里只给一个代码&#xff1b; 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<cmath>5 #include<algorithm>6 #define…

[css] :placeholder-shown和:focus-within这两个伪类你有使用过吗?说说看

[css] :placeholder-shown和:focus-within这两个伪类你有使用过吗&#xff1f;说说看 :focus-within 是一个CSS 伪类 &#xff0c;表示一个元素获得焦点&#xff0c;或&#xff0c;该元素的后代元素获得焦点。换句话说&#xff0c;元素自身或者它的某个后代匹配 :focus 伪类。…

elasticsearch解决同步删除数据库中不存在的数据

摘要: jdbc-input-plugin 只能实现数据库的追加&#xff0c;对于 elasticsearch 增量写入&#xff0c;但经常jdbc源一端的数据库可能会做数据库删除或者更新操作。这样一来数据库与搜索引擎的数据库就出现了不对称的情况。当然你如果有开发团队可以写程序在删除或者更新的时候同…

【BZOJ1048】分割矩阵(记忆化搜索,动态规划)

【BZOJ1048】分割矩阵&#xff08;记忆化搜索&#xff0c;动态规划&#xff09; 题面 BZOJ洛谷 题解 一个很简单的\(dp\)&#xff0c;写成记忆化搜索的形式的挺不错的。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #in…

[css] 使用css实现气泡框的效果

[css] 使用css实现气泡框的效果 <!DOCTYPE html> <html lang"en"><head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title></title> …

JVM内存原理及高级特性

今天看了一篇文章&#xff0c;对JVM内存机制&#xff0c;讲的比较细致&#xff0c;决定转载过来 1、JVM 体系结构 线程共享内存 可以被所有线程共享的区域&#xff0c;包括堆区、方法区、运行时常量池。 1.1 堆&#xff08;Heap&#xff09; 大多数时候&#xff0c;Java 堆…

[css] 如何使用伪元素实现增大点击热区来增加用户体验?

[css] 如何使用伪元素实现增大点击热区来增加用户体验&#xff1f; .extend-via-pseudo-elem {position: relative; }.extend-via-pseudo-elem::before {content: ;position: absolute;top: -20px;right: -20px;bottom: -20px;left: -20px; }个人简介 我是歌谣&#xff0c;欢…

今天读了JDK1.8源码,知道了并行迭代器Spliterator

在JDK1.8的ArrayList里面偶然看到了这个内部类&#xff0c;同时对比了1.7的版本&#xff0c;发现1.7并没有这后面的东西&#xff0c; 随着好奇心&#xff0c;就搜了一下下&#xff0c;发现很有意思~ 也查了一些资料&#xff0c;如下总结&#xff1a; Spliterator是什么&#…

牛客网挑战赛24 青蛙(BFS)

链接&#xff1a;https://www.nowcoder.com/acm/contest/157/E来源&#xff1a;牛客网 有一只可爱的老青蛙&#xff0c;在路的另一端发现了一个黑的东西&#xff0c;想过去一探究竟。于是便开始踏上了旅途 一直这个小路上有很多的隧道&#xff0c;从隧道的a进入&#xff0c;会从…

[css] 如何使用css显示a链接的url?

[css] 如何使用css显示a链接的url&#xff1f; .some-a-tag:before {content: attr(href); }个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

JAVA手写ArrayList以及LinkedList

手写记录一下~ 顶级接口List public interface List<E> {//返回线性表的大小public int getSize();//判断线性表中是否为空public boolean isEmpty();//判断线性表中是否包含元素oboolean contains(E o);//在线性表中查找元素o&#xff0c;若成功找到&#xff0c;返回其…

[css] css中的url()要不要加引号?说说你的理解

[css] css中的url()要不要加引号&#xff1f;说说你的理解 可以加&#xff0c;也可以不加。这个跟html标签的属性书写可以加引号也可以不加引号是一样的道理&#xff0c;当然如果属性中含有特殊字符比如空格则需要加空格&#xff0c;否则会引起浏览器解析错误。如果想养成良好…

JDK源码学习路线~每天学一点~每天进步一点点

很多java开发的小伙伴都会阅读jdk源码&#xff0c;然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的源码范围。 标题为包名&#xff0c;后面序号为优先级1-4&#xff0c;优先级递减 1、java.lang 1) Object 1 2) String 1 3) AbstractStringBuilder 1 4) StringBuff…

[css] 使用css写一个垂直翻转图片的效果

[css] 使用css写一个垂直翻转图片的效果 transform: rotateX(180deg); /* 垂直镜像翻转 */个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

20.pipe

pipe相当于angular1里面的filter 做一些格式转换啊&#xff0c;或者从一个数组里面选取一个元素等等 只要你愿意可以定义很复杂的内容‘’ 我们先看看 angular2 里面自带的一些pipe 我们去我们的week3 下的problem-list下 我们到html里面 之前是这样的 之后是这样的 我们再写三…

TCP/UDP相关知识

三次握手&#xff1a; 为了方便描述我们将主动发起请求的172.16.50.72:65076 主机称为客户端&#xff0c;将返回数据的主机172.16.17.94:8080称为服务器。 第一次握手: 建立连接。客户端发送连接请求&#xff0c;发送SYN报文&#xff0c;将seq设置为0。然后&#xff0c;…

[css] 请写出font属性的快捷写法

[css] 请写出font属性的快捷写法 p { font:italic bold 12px/20px arial,sans-serif; }个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Redis内部数据结构-跳跃表

今天学习了跳跃表&#xff0c;记录一下下~ 一、跳跃表简介 跳跃表是一种随机化数据结构&#xff0c;基于并联的链表&#xff0c;其效率可以比拟平衡二叉树&#xff0c;查找、删除、插入等操作都可以在对数期望时间内完成&#xff0c;对比平衡树&#xff0c;跳跃表的实现要简…

[css] 举例说明与打印有关的属性有哪些?

[css] 举例说明与打印有关的属性有哪些&#xff1f; page page-break-before page-break-after page-break-inside个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题…