主席树入门+博客推荐

学习总结(可以直接翻到最下面,笔芯推荐的资料学习)

  • 主席树是就是多颗线段树的总结
  • 主席树的结构体中的 \(l\) 和 \(r\) 代表的是这个节点的左右子节点的标号,因为空间优化的原因,他们可能不再符合左子树编号等于\(rt<<1\),右子树编号等于\(rt<<1|1\),这也是我开始比较困惑的一点。在学习主席树之前,需要你很熟悉线段树这个东西,因为主席树的主体是多颗线段树,首先我们来简单的回顾一下线段树的简单特点和性质,我们熟悉的线段树一般是用一个结构体表示一个节点,每个节点有一个编号,节点里面一般有两个变量l, r来表示这个节点维护的区间,然后还有一个区间信息(比如区间最大值,最小值,和等,视具体问题而定),当然如果涉及到区间更新,还有一个add或者lazy叫做延迟标记的东西,然后一般线段树最明显的特点就行,一个父节点的编号是i,那么他的两只儿子节点的编号分别为2 * i(左) , 2 * i + 1(右),注意主席树在这一点有别于一般的线段树,每一个父节点,他的两个儿子节点的编号不一定满足这个关系。
  • 主席树的结构体数组需要开多大呢?根据主席树的空间复杂度(这个我不会,我看的博客上的)是\(n*logn\),看的博客上右开 \(n\) 的 20倍和40倍的,这里还是最好算一下,开40倍就很大了。

这里附上一个简单题目的代码

POJ 2104 K-th Number,我也写了关于这个题的博客,代码有注释,可以方便理解。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using  namespace std;
const int maxn=1e5+7;
int root[maxn], a[maxn], x, y, k;
int n, m, cnt, tot;
struct node{int l, r, sum;
}t[maxn*40];
vector<int> v;
int getid(int x)
{return lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
}
void update(int l, int r, int &x, int y, int pos)
{t[++cnt]=t[y];t[cnt].sum++;x=cnt;if(l==r) return ;int mid=(l+r)>>1;if(pos<=mid)update(l, mid, t[x].l, t[y].l, pos);else update(mid+1, r, t[x].r, t[y].r, pos);
}
int query(int l, int r, int x, int y, int k)
{if(l==r)return l;int mid=(l+r)>>1;int sum=t[t[y].l].sum - t[t[x].l].sum; if(k<=sum)return query(l, mid, t[x].l, t[y].l, k);else return query(mid+1, r, t[x].r, t[y].r, k-sum);
}
int main()
{scanf("%d%d", &n, &m);for(int i=1; i<=n; i++){scanf("%d", &a[i]);v.push_back(a[i]);}sort(v.begin(), v.end());v.erase( unique( v.begin(), v.end() ) , v.end() );tot=v.size(); //这里是记录实际需要记录的点的个数for(int i=1; i<=n; i++){update(1, tot, root[i], root[i-1], getid(a[i]) );}for(int i=1; i<=m; i++){scanf("%d%d%d", &x, &y, &k);printf("%d\n", v[ query(1, tot, root[x-1], root[y], k) - 1]);}return 0;} 

博客推荐

强烈推荐这个up主的讲解视频,很清晰,回答了很多问题,强烈推荐,不过up主没有注意到一个问题,就是查找的范围不再是1到n了,因为离散化之后范围缩小了,应该是离散化之后的个数, 这里很重要。

主席树入门,讲解的比较细致,和线段树进行了对比,不错哦

有图,并且图没错还清晰

也有图,但是没代码,算是上面博客的补充把

这个号称最详细的,确实详细,不过一看这么长,我就没耐性看下去了,有耐心可以看看,毕竟代码有详细注释

转载于:https://www.cnblogs.com/alking1001/p/11422868.html

主席树入门+博客推荐相关推荐

  1. Android经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 – 博客园 gundumw100博客 – android进阶分类文章列表 – ITeye技术网站 CSDN ...

  2. 我的Android进阶之旅:经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN ...

  3. 好用的开源个人博客推荐

    原文网址:好用的开源个人博客推荐_IT利刃出鞘的博客-CSDN博客 简介 本文推荐个人从几十款开源个人博客中精选的几款开源博客. halo Github 地址 :https://github.com/ ...

  4. IT技术网站博客推荐

    技术类网站 CSDN 全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台. 51CTO 技术成就梦想 - 中国领先的IT技术网站 itEye Java编程 Spring框架 Aja ...

  5. Android进阶之旅:经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN ...

  6. IT名人博客推荐(15个)载

    IT名人博客推荐(15个) 1. 李彦宏 百度公司总裁 博客地址: http://hi.baidu.com/liyanhong 2. 张朝阳 搜狐董事局主席兼CEO 博客地址:http://charl ...

  7. 胜者树和败者树 - qianye0905 - 博客园

    胜者树和败者树 - qianye0905 - 博客园 胜者树和败者树 胜者树和败者树都是完全二叉树,是树形选择排序的一种变型.每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比 ...

  8. Day 4:PredictionIO——如何创建一个博客推荐器

    今天是"30天学习30种新技术"的第4天.到目前为止我很享受,而且周围开发者反响也很不错.我现在更有动力在30天内完成它了.在这篇文章中,我将介绍如何在Java下使用Predict ...

  9. poj2104 k-th number 主席树入门讲解

    poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树   刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...

  10. 玩聚SD:感谢ECVIP、盗盗、网贝、和菜头的博客推荐

    首先非常感谢电子商务博客和showeb2.0盗盗两位朋友对玩聚SD的推荐,能够在这两位非常优秀的博客上看到SD的名字,真的很感动.[20080616 18:47 updated: 名站网贝也进行了推荐 ...

最新文章

  1. IE浏览器跟火狐浏览器兼容写法3
  2. 为什么说中国式报表特殊-3、报表格式
  3. Keras TensorFlow教程:如何从零开发一个复杂深度学习模型
  4. Jm86中的encode_one_macroblock注释
  5. php function函数用法,js的function函数是什么?js中function的用法
  6. vsftpd配置好防火墙后从网页登录ftp却无法访问此页面
  7. 今年职高计算机数学高考试题,湖南职高对口数学高考试卷
  8. 【备份】使用ubuntu一个月,记录的问题和解决方案
  9. pandas数据处理之合并与拼接
  10. 用spss进行数据的标准化处理_什么是数据标准化、中心化、归一化?SPSS又如何实现?...
  11. 关键词排名提升(提升关键词排名的方法)
  12. NFT是登记在区块链上的所有权证书
  13. 操作系统的名字的读音
  14. 计算机实验室的英语单词,实验室的英语单词
  15. nodejs 获取系统环境变量_Node.js中环境变量process.env的一些事详解
  16. vba 定义类_类模块的定义及设计
  17. oracle check 日期大于,sql – 出生日期的CHECK约束?
  18. CRC 的简介和应用(转载)
  19. shutdown 和close的区别
  20. automake的使用(详细1)

热门文章

  1. 与spring的整合
  2. MySQL-在字段上使用函数不会走索引的原因是什么?
  3. windows环境elasticsearch安装IK分词器
  4. Java泛型通配符T,E,K,V
  5. 汇编实验五 编写、调试具有多个段的程序
  6. Js实现input上传图片并显示缩略图
  7. 动手动脑(Java)
  8. Linux进程管理---task_struct
  9. iptables快速记忆总结
  10. fdisk硬盘分区(1)——系统盘剩余空间创建分区