静态区间第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. 5.2 i++

    答案:第一段21,第二段12 PS:注意运算符的优先级. 答案:A

  2. Android是如何绘制View的

    当一个activity获得焦点时, 它会被要求绘制它的布局. Android框架将处理绘制的过程, 但是activity必须提供它的布局体系的根节点. 绘制将从根节点开始, 根节点被要求测量和绘制布局 ...

  3. 转:关于C++14:你需要知道的新特性

    关于C++14:你需要知道的新特性 遇见C++ Lambda C++14 lambda 教程 C++11 lambda表达式 C++标准库:使用 std::for_each std::generate ...

  4. jQuery中对属性的增删改查

    获取元素的属性 $('input').attr('type') .attr()  可以获取和设置自定义属性 .prop()  只能获取和设置固有属性 在设置属性值时 建议不要修改type属性,有的浏览 ...

  5. [转载]findContours函数参数说明及相关函数

    原文地址:findContours函数参数说明及相关函数作者:鸳都学童 findContours函数,这个函数的原型为: void findContours(InputOutputArray imag ...

  6. c++ string 与 char 互转 以及base64

    c++ string 与 char 互转 很简单如下 ] = {'A','B','C','D','E'}; printf("%s\n",bts); //char to string ...

  7. DBUtils学习

    1.       DBUtils是JDBC的简单封装,可以和JDBC混合使用. 2.       DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次 ...

  8. iOS 常见 Crash 及解决方案

    一.访问了一个已经被释放的对象 在不使用 ARC 的时候,内存要自己管理,这时重复或过早释放都有可能导致 Crash. 例子 NSObject * aObj = [[NSObject alloc] i ...

  9. (转载)Android理解:显式和隐式Intent

    Intent分两种:显式(Explicit intent)和隐式(Implicit intent). 一.显式(设置Component) 显式,即直接指定需要打开的activity对应的类. 以下多种 ...

  10. json2.js 使用

    参考:http://www.cnblogs.com/youring2/archive/2013/03/01/2938850.html github地址:https://github.com/dougl ...