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. python 正则表达式(二)

    下面列举了Python3的所有符号用法,别背,千万别背,用到时来查就行. 字符 含义 . 表示匹配除了换行符外的任何字符注:通过设置 re.DOTALL 标志可以使 . 匹配任何字符(包含换行符) | ...

  2. HTML5中Modernizr类库的作用和使用

    Modernizr 是一个用来检测浏览器功能支持情况的JavaScript 库.通过这个库我们可以检测不同的浏览器对于HTML5特性的支持情况. 使用Modernizr类库和使用其他第三方类库的方法是 ...

  3. php 冒泡排序原理

    $start = microtime(true);   $popArr = array(6,3,23,1,5,100,399,99,66);   echo '6,3,23,1,5,100,399,99 ...

  4. H264 NALU 使用PS封装 RTP发送

    最近由于项目平台需求,要将H264 NALU封装为PS再用RTP发送,PS封装按照ISO DEC-13818-1标准.一个PS包包含PS Header, PES Header, PS system h ...

  5. 【LeetCode】018 4Sum

    题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...

  6. Operating System-Thread(1)What and Why Thread &&进程和线程的对比

    开始线程(Thread)之旅,作为程序员,打交道更多的是线程,各种多线程程序,并行编程都是以线程为基础进行的.本文主要内容: What and Why Thread 进程和线程的对比 一.What a ...

  7. 1.4 isAlive()方法

    方法isAlive()是判断当前线程是否处于活动状态. 线程代码: public class TestThread extends Thread{ @Override public void run( ...

  8. rsync 介绍和参数说明

    Rsync 介绍: 我们经常需要在不同目录或者服务器之间做文件同步和更新,Linux提供了很多内置命令可以使用比如scp等等,但是今天我们介绍一个更加强大的工具rsync.rsync 命令是一个远程同 ...

  9. k8s基础(3)etcd集群

    下载安装 https://github.com/coreos/etcd/releases 在这网页,可以看到有多个版本共选择. 下载3.25 解压后, cd etcd-v3.2.5-linux-amd ...

  10. [nowCoder] 两个长度相同有序数组的中位数

    给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数.例如:arr1 = {1,2,3,4};arr2 = {3,4,5,6};一共8个数则上中位数是第4个数,所以返回 ...