主席树初步 HDU2665的区间第k小
首先看一下这个人的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小的更多相关文章
- 主席树总结(经典区间第k小问题)(主席树,线段树)
接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...
- poj 2761 主席树的应用(查询区间第k小值)
Feed the dogs Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 22084 Accepted: 7033 De ...
- 线段树专题2-(加强版线段树-可持续化线段树)主席树 orz! ------用于解决区间第k大的问题----xdoj-1216
poj-2104(区间第K大问题) #include <iostream> #include <algorithm> #include <cstdio> #incl ...
- ZOJ -2112 Dynamic Rankings 主席树 待修改的区间第K大
Dynamic Rankings 带修改的区间第K大其实就是先和静态区间第K大的操作一样.先建立一颗主席树, 然后再在树状数组的每一个节点开线段树(其实也是主席树,共用节点), 每次修改的时候都按照树 ...
- POJ2104&&HDU2665(静态区间第K小)
题目大意 给定一个有N个数字的序列,然后又m个查询,形式如下: l r k 要求你返回区间[l,r]第k小的数是哪个 题解 终于弄懂主席树是个啥东西了,O(∩_∩)O~~,这题正是主席树的裸题,主席树 ...
- ZOJ2112 BZOJ1901 Dynamic Rankings 树套树 带修改的区间第k小
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 树套树,线段树套splay或者主席树套树状数组,我抄了一下hzwer ...
- 主席树套树状数组 动态区间第k小
先打上代码以后更新解释 #include <cstdio> #include <iostream> #include <algorithm> #include &l ...
- 【可持久化线段树】POJ2104 查询区间第k小值
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 61284 Accepted: 21504 Ca ...
- 主席树初步学习笔记(可持久化数组?静态区间第k大?)
我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构( ...
随机推荐
- 12c 补丁架构 以及opatch 功能
cd $ORACLE_HOME/ccr/bin ./emocmrsp oracle@qc550705:/oracle/app/oracle/product/12.1.0.2/db_1/ccr/bin& ...
- PHP通过url下载远程图片到本地
function GrabImage($url,$filename) { if($url==""):return false;endif; ob_start(); readfile ...
- Java1.5泛型指南中文版(Java1.5 Generic Tutorial)
Java1.5泛型指南中文版(Java1.5 Generic Tutorial) 英文版pdf下载链接:http://java.sun.com/j2se/1.5/pdf/generics-tutori ...
- 更改web project 访问项目名称
1.新建web project 2.右键该项目名称------properties 3.访问该项目的URL http://localhost:8806/ssm/.......... 相比书写整个项目名 ...
- hdu_3709_Balanced Number(数位DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意:给你一个区间,让你找平衡数的个数 题解:设dp[i][j][k]为前i位以第j位为支撑点的 ...
- 定时执行.SH
crontab -l 看自定义定时列表 crontab -e 编辑 */10 * * * * /bak/bak.sh10分钟执行一次 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- Django:之中间件、微信接口和单元测试
Django中间件 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通过中间件中的 pr ...
- 第5章 字符串----char与String
1.java有8种基本数据类型: 数值型:整数类型(byte,short,int,long) :浮点类型(float,double) 字符型:char 布尔型:true,false 2.char: ...
- swap in java?
Is it possible to write a swap method in java? these two variables will be primitives. It's not poss ...
- HTML5的自定义属性data-*详细介绍和JS操作实例
当然高级浏览器下可通过脚本进行定义和数据存取.在项目实践中非常有用. 例如: 复制代码 代码如下: <div id = "user" data-uid = "123 ...