首先看一下这个人的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. 观后感-MySQL索引类型 btree索引和hash索引的区别

    http://www.cnblogs.com/osfipin/p/4943229.html.http://www.2cto.com/database/201411/351106.html-文章地址 首 ...

  2. iOS使用Swift语言检查并提示更新

    项目要上线了,产品要求跟安卓一样,一进去有一个提示框提示更新.虽然苹果在 Settings/iTunes Store & App Store 选项中有自动更新这一选项,而且添加版本号等等有被拒 ...

  3. crontab定时任务以及其中中文乱码问题

    一.小例子 1.写个测试文件 2.将文件权限变为可执行文件 3.在crontab文件中写定时任务 格式: 分/时 * * * 用户名 可执行文件路径 >> log文件路径 2>&am ...

  4. 能加载文件或程序集“XXX”或它的某一个依赖项,系统找不到指定的文件

    能加载文件或程序集“XXX”或它的某一个依赖项,系统找不到指定的文件 http://blog.csdn.net/pplcheer/article/details/7796211 做项目总是遇到各种的问 ...

  5. 手把手教你ranorex_android自动化测试第一个示例

    要说android的自动化,那真是折腾死我了,从早期的monkeyrunner,到后来的robotium,再到最新的uiautomator,各有各的问题,总之性价比都不够高,不太适合我的使用场景.于是 ...

  6. linux中iptables配置文件及命令详解详解

    iptables配置文件 直接改iptables配置就可以了:vim /etc/sysconfig/iptables. 1.关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放. 下 ...

  7. 第二十节,基本数据类型,集合set、综合应用新数据更新老数据

    基本数据类型,集合set.综合应用新数据更新老数据 创建两个字典新数据,更新原始数据,a为原始数据,b为新数据 1,分别获取到a字典和b字典的key(键),将两个字典的键分别转换成两个集合 2,找出a ...

  8. android网络编程之HttpUrlConnection的讲解--实现文件断点下载

    1.没有实现服务器端,下载地址为网上的一个下载链接. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android. ...

  9. 【Valse首发】CNN的近期进展与实用技巧(上)

    作者:程程链接:https://zhuanlan.zhihu.com/p/21432547来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 深度学习大讲堂致力于推送人工智 ...

  10. android,view的执行过程onDraw、onSizeChanged,onFinishInflate

    小试view的执行过程,此是入门,高手绕道. ----------------------------------------------------------------------------- ...