luogup3834(主席树模板)

给定由N个正整数构成的序列,将对于指定的闭区间查询m次其区间内第k小值。1≤N,M≤2e5。

有一个做法,是对于每个序列的前缀建一颗权值线段树,然后通过权值线段树相减得到的权值线段树来查询第k小值。由于单点修改只需要改动logn个结点,第i个主席树可以依托第i-1个存在。具体的做法是将路径上的点从上到下依次克隆一遍。时间复杂度和空间复杂度都是nlogn。

#include <cctype>
#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=2e5+5, maxstree=maxn*60;
struct node{
int l, r, x;
}stree[maxstree]; //a:离散化后的序列 b:离散化的数对应的值
int n, m, a[maxn], b[maxn], cntu;
//cntnode:主席树一共有几个结点
int cntnode=1, root[maxn]; //root:第i棵线段树的根的位置 //在主席树的当前区间[l, r)中插入值为v的结点
//now位置的结点会被拷贝一份生成新的结点
void insert(int &now, int l, int r, int v){
stree[cntnode]=stree[now]; now=cntnode; //(此处一举两得,既更新了父节点的孩子编号,又把操作转到了被复制的节点)
++stree[cntnode++].x;
if (l==r-1) return;
int mid=(l+r)>>1;
if (v<mid) insert(stree[now].l, l, mid, v);
else insert(stree[now].r, mid, r, v);
} //在区间[l, r)中,定位第k大数
int query(int now1, int now2, int l, int r, int k){
if (l==r-1) return l;
int t=stree[stree[now2].l].x-stree[stree[now1].l].x, mid=(l+r)>>1;
if (k<=t) return query(stree[now1].l, stree[now2].l, l, mid, k);
else return query(stree[now1].r, stree[now2].r, mid, r, k-t);
} inline void get(int &x){
char c; int flag=1;
for (; c=getchar(), !isdigit(c); )
if (c=='-') flag=-1;
for (x=c-48; c=getchar(), isdigit(c); )
x=(x<<3)+(x<<1)+c-48; x*=flag;
} int main(){
get(n); get(m);
for (int i=0; i<n; ++i){ get(a[i]); b[i]=a[i]; }
sort(b, b+n); cntu=unique(b, b+n)-b;
for (int i=0; i<n; ++i) a[i]=lower_bound(b, b+cntu, a[i])-b;
for (int i=0; i<n; ++i){ root[i+1]=root[i]; insert(root[i+1], 0, n, a[i]); }
int t1, t2, t3;
while (m--){
get(t1); get(t2); get(t3);
printf("%d\n", b[query(root[t1-1], root[t2], 0, n, t3)]);
}
return 0;
}

luogup3834(主席树模板)的更多相关文章

  1. 【POJ 2104】 K-th Number 主席树模板题

    达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...

  2. 主席树:POJ2104 K-th Number (主席树模板题)

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

  3. 【Luogu】P3384主席树模板(主席树查询K小数)

    YEAH!我也是一个AC主席树模板的人了! 其实是个半吊子 我将尽量详细的讲出我的想法. 主席树太难,我们先搞普通线段树好了 普通线段树怎么做?我的想法是查询K次最小值,每次查完把查的数改成INF,查 ...

  4. 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题

    达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...

  5. poj2104 主席树模板题

    题意 给出n个数字组成的数字序列,有m组询问.每次询问包含三个数字l,r,k.对于每个询问输出序列区间[l,r]中第k大的数字. 分析 这是主席树的模板题,套板子就可以 #include <cs ...

  6. 主席树模板poj 2104

    资料1:http://blog.csdn.net/regina8023/article/details/41910615 资料2:模板来源:http://www.cnblogs.com/lidaxin ...

  7. 洛谷3834 hdu2665主席树模板,动态查询区间第k小

    题目链接:https://www.luogu.com.cn/problem/P3834 对于区间查询第k小的问题,在区间数量达到5e5的时候是难以用朴素数据结构实现的,这时候主席树就应运而生了,主席树 ...

  8. 2015百度之星1002 查找有序序列(RMQ+主席树模板水过)

    题意:求在数列中能找到几个个长度为k 的区间,里面的 k 个数字排完序后是连续的. 思路:枚举范围,判断区间内是否有重复的数字(主席树),没有的话求区间最大-区间最小(RMQ),判断是否等于K,是的话 ...

  9. 主席树模板(poj2104)

    主席树是可持久化线段树,可以记录线段树的历史版本. 代码中和线段树不同的是,l,r记录的是左右子树编号,因为普通的线段树版本中,左右子树自然就是o<<1和o<<1|1,但是主席 ...

随机推荐

  1. WEB安全之Token浅谈

    Token一般用在两个地方——防止表单重复提交.anti csrf攻击(跨站点请求伪造). 两者在原理上都是通过session token来实现的.当客户端请求页面时,服务器会生成一个随机数Token ...

  2. RouterOS(ROS)简单限速/单IP限速脚

    暂无评论 有时企业环境,或个人使用环境需要针对不同IP设置较多条不同限速,可以使用以下脚本批量处理后,再针对性的修改. *脚本说明:“2 to 254”定义要设置受限IP的起始,后面“192.168. ...

  3. xxx was built without full bitcode" 编译错误解决

    xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...

  4. 机器学习 Generative Learning Algorithm (B)

    Naive Bayes 在GDA模型中,特征向量x是连续的实数向量,在这一讲里,我们将要讨论另外一种算法用来处理特征向量x是离散值的情况. 我们先考虑一个例子,用机器学习的方法建立一个垃圾邮件过滤器, ...

  5. Mysql 排序null值 排序问题分析

    mysql中null值的排序问题分析   如下表t_user:  name age zhangsan 1 lisi NULL wangwu 2   www.2cto.com   执行一下sql:  S ...

  6. git rebase小计(转)

    git rebase,顾名思义,就是重新定义(re)起点(base)的作用,即重新定义分支的版本库状态.要搞清楚这个东西,要先看看版本库状态切换的两种情况: 我们知道,在某个分支上,我们可以通过git ...

  7. Image Sub-pixel interpolation by Verilog

    bilinear interpolation -------------------------------------------------------- input a0  a1 b0  b1 ...

  8. HDOJ1114(完全背包)

    #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const ...

  9. arm交叉编译 扫盲贴

    ARM交叉编译工具链 为什么要用交叉编译器? 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序, 比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平 ...

  10. hibernate 数据关联一对多

    一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...