首先看一下这个人的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. 如何通过Maven的Tomcat插件运行Web工程

    去tomcat官网http://tomcat.apache.org/,左侧栏Apache Tomcat下的Maven Plugin,点进去选择最新版本Version 2.2 通过介绍可知,使用tomc ...

  2. HDU2544-最短路(最短路模版题目)

    Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要 ...

  3. nginx(ubuntu)设置别名访问目录

    1 2 3 4 5 6 7 8 9 10 11 12 13 location /phpmyadmin/ { alias  /data/phpmyadmin/; index  index.html in ...

  4. uci随笔

    UCI : Unified Configuration Interface1.基于nvram配置2.只需修改UCI配置文件3.配置文件存放在路径/etc/config/目录下4.可以通过uci命令或者 ...

  5. .NET面试题目二

    1.对你来说工作中最重要的是什么? 答:团队目标的实现.(这是所有公司希望员工拥有的素质) 2.为什么愿意为本公司工作? 答:因为我认为我可以与贵公司取得共同的发展.(暗示留下我可能为公司带来的益处) ...

  6. 手机端的META你知道多少?

    一.天猫 <title>天猫触屏版</title> <meta content="text/html; charset=utf-8" http-equ ...

  7. MySQL数据库分区修改【原创】

    之前有个表分区添加时s201607添加成s201617,所以在查询7月份数据时报错 错误的 alter table statistics_ticket add partition (partition ...

  8. MySQL的索引创建、删除

    1_1.添加PRIMARY KEY(主键索引)  mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 1_2.添加UNIQUE ...

  9. hostent h_addr_list

    struct hostent { char FAR * h_name; /* official name of host */ char FAR * FAR * h_aliases; /* alias ...

  10. 作为Web开发人员,我为什么喜欢Google Chrome浏览器

    来源: http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.html 在Google Chrome浏览器出来之前,我一直使用FireF ...