主席树入门 时隔5个月,我又来填主席树的坑了,现在才发现学算法真的要懂了之后,再自己调试,慢慢写出来,如果不懂,就只会按照代码敲,是不会有任何提升的,都不如不照着敲. 所以搞算法一定要弄清原理,和代码为什么要这么写. 下面是我找的一篇博客,写的真的很好,我就是用这个看懂的,但我还觉得有几点注意要说: 一: 你要想学主席树,就一定要会灵活运用线段树,这里也有一篇线段树的博客:点这里 我认为当你把这上面给出代码的题都自己写了一遍之后 你就算是可以灵活运用线段树了. 二: 下面这篇博客给出的那个例子非…
poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树   刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后的线段树 然后有可加减性 也就是说你每添加的一个点的那棵树都给你保留下来了 呃 ... 这么说好像还是有点生涩 那么就拿poj2104来举例子吧 慢慢讲我觉得会很好的 题意就是给你一个100000长度的数字 然后100000次询问[L,R]之间第k大的数字是多少 这个很容易看出来 暴力根本不可以 黑…
poj2104找了个板子..,但是各种IO还可以进行优化 /* 找区间[l,r]第k大的数 */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define maxn 100005 ]; int n,q,a[maxn],b[maxn],m,rt[maxn],size; int build(int l,int r){…
我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构(是线段树畸形程度的两倍),然而不学又不行,在考试中出现的频率也很高(?),更重要的是它向我们展示了一个船新的思想--可持久化. 在我学习主席树时,我在网上查了一篇又一篇博客,然而还是感到非常懵逼 0_0 ,这些博客大多由静态区间第k小这一问题来作为学习主席树的切入点,然而--当我学会主席树之后,我才…
题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; ; ][mx]; int sortt[mx]; ][mx]; void build(int l,int r,int c) { if (l==r) return ; ; ; ; for (int i…
K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 50247   Accepted: 17101 Case Time Limit: 2000MS Description You are working for Macrohard company in data structures department. After failing your previous task about key inse…
上午看书总结 今天上午我看了拓扑排序,DFS+剪枝,相当于回顾了一下,写了三个比较好的例题.算法竞赛指南93~109页. 1.状态压缩+拓扑排序 https://www.cnblogs.com/2462478392Lee/p/11285039.html 2.DFS+剪枝 https://www.cnblogs.com/2462478392Lee/p/11285065.html 3.DFS+剪枝+数学 https://www.cnblogs.com/2462478392Lee/p/11285085…
题意:查找区间内不同数字的个数. 两种做法,一种是 树状数组离线,另一种就是主席树. 树状数组离线操作的链接 http://www.cnblogs.com/oneshot/p/4110415.html 两种方法思路差不多,都是扫一遍,如果这个数曾经出现过那么就 在上次位置-1,如果没有出现过就在 当前位置+1,同时更新该数字的最新的位置. 这样的话,在主席树里面 以x为根的线段树存的就是1-x之间不同的数字的个数.我们只需要查找以r为根的线段树同时大于l的区间内的个数就行了. 给主席跪了,orz…
POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使其支持询问历史版本.同时充分利用它们之间的共同数据来减少时间和空间消耗. 主席树:对原序列的每一个前缀[1..i]建立出一棵线段树维护值域上每个数的出现次数(所以要先离散化).线段树每个节点保存的是区间中前缀对应的值出现的次数. 注意: 这里没有使用指针,而是给每个节点编号,通过编号来将节点与左右子…
两道题都是区间第K大询问,数据规模基本相同. 解决这种问题, 可以采用平方划分(块状表)复杂度也可以接受,但是实际表现比主席树差得多. 这里大致讲一下我对主席树的理解. 首先,如果对于某个区间[L,R],对这个区间排序后,我们构造出了线段树, 每个值在这个子区间出现了几次都可以从线段树中查询,我们就可以在对数时间解决询问. 现在的问题就是怎样在时空复杂度O(nlogn)的时间内构造出这么多的线段树! 1.首先对原序列a排序并删去重复得到新序列b 2.对a的每个前缀构造线段树,即a的前i个数出现在…