静态区间第k大的问题,往往可以利用主席树来解决

这是主席树的第一道题

主席树大概可以理解为在n个节点上都建立一棵线段树,但是想想会超出内存

每一个节点保存的线段树都记录当前整段前缀区间的信息

但是因为每次添加后一个节点,那么他除了当前节点位置需要更新之外,其他的位置都可以保持跟上一棵节点对应的线段树一致,那么为了缩小内存,

将那些不需要改变的点的指针指向上一棵树对应的节点即可,其他多生成的节点也就是需要更新的节点,最多不超过log2n个,所以最后产生的线段树的

点的个数大概在nlogn的大致范围内

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define N 100005
#define M int m=(l+r)>>1
#define LS(o) node[o].ls
#define RS(o) node[o].rs int n , m , a[N] , b[N] , T[N]; struct Node{
int sz , ls , rs;
void init(){sz=;ls=rs=;}
}node[N*]; int tot; int build(int l , int r)
{
int u = tot++;
node[u].init();
if(l!=r){
M;
node[u].ls = build(l , m);
node[u].rs = build(m+ , r);
}
return u;
} void build(int o1 , int o2 , int l , int r , int pos)
{
node[o2].init();
node[o2].sz = node[o1].sz+;
M;
if(l == r) return;
if(pos<=m){
node[o2].ls = tot++ , node[o2].rs = RS(o1);
build(LS(o1) , LS(o2) , l , m , pos);
}
else {
node[o2].rs = tot++ , node[o2].ls = LS(o1);
build(RS(o1) , RS(o2) , m+ , r , pos);
}
} int query(int o1 , int o2 , int l , int r , int k)
{
if(l==r) return l;
M;
int tmp;
if((tmp=node[LS(o2)].sz - node[LS(o1)].sz)>=k) return query(LS(o1) , LS(o2) , l , m , k);
else return query(RS(o1) , RS(o2) , m+ , r , k-tmp);
} int main()
{
// freopen("in.txt" , "r" , stdin);
while(~scanf("%d%d" , &n , &m)){
for(int i= ; i<=n ; i++)scanf("%d" , a+i);
for(int i= ; i<=n ; i++)b[i]=a[i];
sort(b+ , b+n+);
tot = ;
T[] = build( , n);
for(int i= ; i<=n ; i++){
int pos = lower_bound(b+ , b+n+ , a[i])-b;
T[i] = tot++;
build(T[i-] , T[i] , , n , pos);
}
while(m--){
int s , t , k;
scanf("%d%d%d" , &s , &t , &k);
int pos = query(T[s-] , T[t] , , n , k);
printf("%d\n" , b[pos]);
}
}
return ;
}

POJ 2104 静态找区间第k大的更多相关文章

  1. POJ 2104 求序列里第K大 主席树裸题

    给定一个n的序列,有m个询问 每次询问求l-r 里面第k大的数字是什么 只有询问,没有修改 可以用归并树和划分树(我都没学过..囧) 我是专门冲着弄主席树来的 对主席树的建树方式有点了解了,不过这题为 ...

  2. POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)

    题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...

  3. POJ 2104(K-th Number-区间第k大-主席树)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 31790   Accepted: 9838 Cas ...

  4. POJ 2104 && POJ 2761 (静态区间第k大,主席树)

    查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...

  5. 【POJ】【2104】区间第K大

    可持久化线段树 可持久化线段树是一种神奇的数据结构,它跟我们原来常用的线段树不同,它每次更新是不更改原来数据的,而是新开节点,维护它的历史版本,实现“可持久化”.(当然视情况也会有需要修改的时候) 可 ...

  6. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

  7. poj 2104 主席树(区间第k大)

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

  8. POJ 2104 HDU 2665 主席树 解决区间第K大

    两道题都是区间第K大询问,数据规模基本相同. 解决这种问题, 可以采用平方划分(块状表)复杂度也可以接受,但是实际表现比主席树差得多. 这里大致讲一下我对主席树的理解. 首先,如果对于某个区间[L,R ...

  9. 数据结构2 静态区间第K大/第K小

    给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多 ...

随机推荐

  1. POJ 3468 线段树裸题

    这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...

  2. 【服务器环境搭建-Centos】系统分区 待续

    df命令查看,显示/dev/vda,而不是sda或hda ,为什么? 虚拟机为了提升性能,一般使用virtio作为磁盘驱动,在虚拟机里面磁盘会显示成vda而不是传统的sda,有什么办法可以让他显示成s ...

  3. redis命令集合

    一.连接控制 QUIT 关闭连接 AUTH (仅限启用时)简单的密码验证 二.适合全体类型的命令 EXISTS key 判断一个键是否存在;存在返回 1;否则返回0;DEL key 删除某个key,或 ...

  4. HTML4 和 HTML5 的10个关键区别

    HTML5是HTML标准的下一个版本.越来越多的程序员开始HTML5来构建网站.如果你同时使用HTML4和HTML5的话 ,你会发现用HTML5从头构建,比从HTML4迁移到HTML5要方便很多.虽然 ...

  5. jq--回到顶部

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. jmeter 监听的介绍

    一个侦听器是一个组件,显示的结果 样本. 结果可以显示在一个树,表格,图表或简单地写入到日志中 文件. 查看的内容反应任何给定的采样器,添加的监听器” 视图 结果树 ”或“ 视图的结果表 一个测试计划 ...

  7. hdu 4034 Graph (floyd的深入理解)

    Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Submi ...

  8. 张艾迪(创始人):发明Global.World.224C的天才

    Eidyzhang: Genius.Founder.CEO.23 I 世界级最高级创始人.世界最高级FounderCEO 出生在亚洲中国.Eidyzhang 拥有黑色头发白色皮肤(20岁)大学辍学生. ...

  9. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ..

    解决办法是:关闭tomcat,双击eclipse下tomcat服务器,在出来的Tomcat server at localhost页面中找到server options选项,选中其中的选项" ...

  10. Redis(7)Creating and Using Cluster Mode

    1. DocumentsCluster will not support SELECT, it only contains database 0.All the nodes use TCP bus a ...