首先看一下这个人的blog吧,讲的精炼http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html

然后再推荐一下这个人的blog:http://www.cnblogs.com/zinthos/p/3899565.html

这两个博客看了就差不多了。

自己说一下对代码的理解吧。

就是每一个数字开一个空间,然后每个空间用tot标号,最后tot就是总体开的数目。然后不同的线段树可能有相同的左儿子或者右二子(或者左=右,右=左),然后具体都是通过tot的储存值表现出来,大致就是这样吧。

代码挺裸的:

//看看会不会爆int! 或者绝对值问题。
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define ALL(a) a.begin(), a.end()
const int maxn = + ;
struct Segment{
int lb, rb;
int cnt;
Segment(int l = , int r = , int c = ): lb(l), rb(r), cnt(c){}
}s[maxn * ];
int root[maxn];
int a[maxn];
int n, m, tot; int buildtree(int l, int r){
int k = tot++;
if (l == r){
s[k] = Segment(, , );
return k;
}
int mid = (l + r) / ;
if (mid >= l) s[k].lb = buildtree(l, mid);
else s[k].rb = buildtree(mid + , r);
return k;
} inline void push_up(int o){
s[o].cnt = s[s[o].lb].cnt + s[s[o].rb].cnt;
} int update(int o, int l, int r, int pos, int val){
int k = tot++;
s[k] = s[o];
if (l == r && l == pos){
s[k].cnt += val;
return k;
}
int mid = (l + r) / ;
if (mid >= pos) s[k].lb = update(s[o].lb, l, mid, pos, val);
else s[k].rb = update(s[o].rb, mid + , r, pos, val);
push_up(k);
return k;
} int query(int o1, int o2, int l, int r, int num){
if (l == r) return l;
int mid = (l + r) / ;
int res = s[s[o1].lb].cnt - s[s[o2].lb].cnt;
if (res >= num) return query(s[o1].lb, s[o2].lb, l, mid, num);
else return query(s[o1].rb, s[o2].rb, mid + , r, num - res);
} int main(){
while (scanf("%d%d", &n, &m) == ){
vector<int> v(n);
for (int i = ; i <= n; i++){
scanf("%d", a + i);
v[i - ] = a[i];
}
sort(ALL(v));
v.erase(unique(ALL(v)), v.end());
for (int i = ; i <= n; i++){
a[i] = lower_bound(ALL(v), a[i]) - v.begin() + ;
}
tot = ; int len = v.size();
root[] = buildtree(, len);
for (int i = ; i <= n; i++){
root[i] = update(root[i - ], , len, a[i], );
}
for (int i = ; i <= m; i++){
int l, r, num;
scanf("%d%d%d", &l, &r, &num);
int pos = query(root[r], root[l - ], , len, num);
printf("%d\n", v[pos - ]);
}
}
return ;
}

主席树初步 HDU2665的区间第k小的更多相关文章

  1. 主席树总结(经典区间第k小问题)(主席树,线段树)

    接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...

  2. poj 2761 主席树的应用(查询区间第k小值)

    Feed the dogs Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 22084   Accepted: 7033 De ...

  3. 线段树专题2-(加强版线段树-可持续化线段树)主席树 orz! ------用于解决区间第k大的问题----xdoj-1216

    poj-2104(区间第K大问题) #include <iostream> #include <algorithm> #include <cstdio> #incl ...

  4. ZOJ -2112 Dynamic Rankings 主席树 待修改的区间第K大

    Dynamic Rankings 带修改的区间第K大其实就是先和静态区间第K大的操作一样.先建立一颗主席树, 然后再在树状数组的每一个节点开线段树(其实也是主席树,共用节点), 每次修改的时候都按照树 ...

  5. POJ2104&&HDU2665(静态区间第K小)

    题目大意 给定一个有N个数字的序列,然后又m个查询,形式如下: l r k 要求你返回区间[l,r]第k小的数是哪个 题解 终于弄懂主席树是个啥东西了,O(∩_∩)O~~,这题正是主席树的裸题,主席树 ...

  6. ZOJ2112 BZOJ1901 Dynamic Rankings 树套树 带修改的区间第k小

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 树套树,线段树套splay或者主席树套树状数组,我抄了一下hzwer ...

  7. 主席树套树状数组 动态区间第k小

    先打上代码以后更新解释 #include <cstdio> #include <iostream> #include <algorithm> #include &l ...

  8. 【可持久化线段树】POJ2104 查询区间第k小值

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 61284   Accepted: 21504 Ca ...

  9. 主席树初步学习笔记(可持久化数组?静态区间第k大?)

    我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构( ...

随机推荐

  1. xxx app 项目问题解决一览

    前话:作为人生旅途中的小记录 不同账号玩法限制       解决 <vn_rule>x</vn_rule> 6.调整下注筹码 **** 解决 不同账号的玩法限制    **** ...

  2. 学习笔记——迭代器模式Iterator

    迭代器模式,使用很多,但是很少实现.常用的集合都支持迭代器. 集合中的CreateIterator()可用于创建自己的迭代器,在里面通过调用迭代器的构造函数Iterator(Aggregate)来绑定 ...

  3. 【bug】Unable to execute dex: Multiple dex files define

    This is a build path issue. Make sure your bin folder is not included in your build path. Right clic ...

  4. C++编写一个简单的DLL

    什么是DLL: 自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上 Windows操作系统中几乎所有的内容都由DL ...

  5. CSS3秘笈:第四章

    第四章  继承 1.继承:应用在一个标签上的CSS样式被传到其内嵌标签上的过程. 2.继承的局限性: (1)有些属性不会被继承,如:CSS. (2)以下情况不会严格执行继承: ·影响网页元素位置的属性 ...

  6. linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(

    VIRT,RES,SHR,虚拟内存和物理内存(转) VIRT: 1.进程"需要的"虚拟内存大小,包括进程使用的库.代码.数据,以及malloc.new分配的堆空间和分配的栈空间等: ...

  7. 在Linux中设置共享目录

    1.  是否安装了samba服务 sudo apt-get install samba sudo apt-get install smbfs 2.  创建需要共享的目录/ home/usr/share ...

  8. shell命令一行代码搞定【转】

    查看文件内容-while: cat 1.txt|while read line;do echo $line;done while read line; do echo $line; done < ...

  9. phonegap的照相机API

    1. Camera Api简单介绍 2. 拍照 3. 预览照片 一. Camera Api简单介绍 Camera选择使用摄像头拍照,或从设备相册中获取一张照片.图片以base64编码的 字符串或图片U ...

  10. Linux下的编程实战【转】

    一篇比较不错的文章, 降到了 makefile make , gcc编译器,GDB调试器, Linux文件系统,Linux文件API,.C语言库函数(C库函数的文件操作实际上是独立于具体的操作系统平台 ...