主席树初步 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... 前言:主席树这个东西,可以说是一种非常畸形的数据结构( ...
随机推荐
- 使用NSURLProtocol实现UIWebView的离线缓存
http://blog.csdn.net/youcanping2008/article/details/9240487
- 使用cocoapods的两个大坑的修改方法
1.报错内容: [!] The dependency `ReactiveCocoa (= 2.1.8)` is not used in any concrete target. The depende ...
- 2016年7款最流行的Java框架
虽然Java一直被唱衰,但是直到现在Java也坚持霸主地位不动摇,毫无疑问,Java是目前最热门的编程语言之一,所以我们为大家搜集了一些目前比较受欢迎的Java框架的消息. 根据RebelLabs对在 ...
- 高级CSS
target="_black"新窗口打开,且打开第二个链接出来的页面覆盖第一个页面 .ui-pg-table td[dir="ltr"]{*width:94px ...
- 第一个WebAPI项目
(1)新建一个ASP.NET MVC项目,取名为:MyMvcWebAPIDemo,项目类型选择WebAPI. (2)在Models中新增一个类,取名为:Product,作为我们要测试的实体模型. ...
- 如何使用 AngularJS 的 ngShow 和 ngHide
今天我们来看看怎样使用Angular的ngShow 和ngHide 指令来完成它们听起来应该完成的,显示和隐藏! 它们应该做的事 ngShow 和ngHide 允许我们显示或隐藏不同的元素.这有助于创 ...
- unity3d自带帮助文档的打开方法
1废话不提,直接上图: 2.在弹出来的浏览器窗口中点击: 3.在点击后的网页中即可以搜索了,在断网的情况下,作为资料查询还是蛮不错的.
- laravel使用多个数据库连接
1.配置.env文件 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=database_name DB_USERNAME= ...
- Explain of Interaction Operators in UML?
来源于:EA 中的 Interaction Operators Enterprise Architect User Guide Operator Action alt Divide up intera ...
- postfix日志分析pflogsumm
1.pflogsumm功能:统计接收.投递.转发.延时.反弹.拒绝.保留.丢弃的邮件统计发件人和收件人 统计发送和接受方主机/域名 统计SMTPD连接数...... 2.安装# yum install ...