1、题目大意:区间第k小,什么修改没有。。。

2、分析:这个是可持久化线段树,也是主席树,解释一下,n个线段树是怎么存下的,就是每一颗线段树和前一个有logn个点不一样

然后我们只需要一个线段树开logn的空间,然后其他的指针指向上一个线段树对应的地方也是可以的对吧

然后。。然后就没了。。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int a[2000010], l[2000010];
pair<int , int> b[2000010];
int T[2000010], ls[2000010], rs[2000010];
int h[2000010];
int cnt[2000010];
int tot;
int num = 0;
inline int insert(int root, int pos){
    int nroot = ++ tot;
    int ret = nroot;
    int l = 1, r = num;
    cnt[nroot] = cnt[root] + 1;
    while(l < r){
        int mid = (l + r) / 2;
        if(pos <= mid){
            r = mid;
            ls[nroot] = ++ tot;
            rs[nroot] = rs[root];
            nroot = ls[nroot];
            root = ls[root];
            cnt[nroot] = cnt[root] + 1;
        }
        else {
            l = mid + 1;
            ls[nroot] = ls[root];
            rs[nroot] = ++ tot;
            nroot = rs[nroot];
            root = rs[root];
        }
        cnt[nroot] = cnt[root] + 1;
    }
    return ret;
}
inline int query(int lll, int rrr, int k){
    int l = 1, r = num;
    int le_ = T[lll - 1];
    int ri_ = T[rrr];
    while(l < r){
        int mid = (l + r) / 2;
        int q = cnt[ls[ri_]] - cnt[ls[le_]];
        if(k <= q){
            r = mid;
            le_ = ls[le_];
            ri_ = ls[ri_];
        }
        else{
            l = mid + 1;
            k -= q;
            le_ = rs[le_];
            ri_ = rs[ri_];
        }
    }
    return l;
}
int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++){
        scanf("%d", &a[i]);
        b[i] = make_pair(a[i], i);
    }
    sort(b + 1, b + n + 1);
    b[0].first = -2147483647;
    for(int i = 1; i <= n; i ++){
        if(b[i].first != b[i - 1].first) num ++;
        l[b[i].second] = num;
        h[num] = b[i].second;
    }
    T[0] = 1;
    tot = 1;
    for(int i = 1; i <= n; i ++) T[i] = insert(T[i - 1], l[i]);
    for(int i = 1; i <= m; i ++){
        int l, r, k;
        scanf("%d%d%d", &l, &r, &k);
        printf("%d\n", a[h[query(l, r, k)]]);
    }
    return 0;
} 

POJ2104 —— K-th number的更多相关文章

  1. [POJ2104] K – th Number (可持久化线段树 主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  2. 【POJ2104】K-th Number

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3

  3. C++之路进阶——poj2104(K-th Number)

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

  4. 【poj2104】K-th Number 主席树

    题目描述 You are working for Macrohard company in data structures department. After failing your previou ...

  5. 【POJ2104】K-th Number(主席树)

    题意:有n个数组成的序列,要求维护数据结构支持在线的下列两种操作: 1:单点修改,将第x个数修改成y 2:区间查询,询问从第x个数到第y个之间第K大的数 n<=100000,a[i]<=1 ...

  6. poj2104:K-th Number

    思路:可持久化线段树,利用权值线段树,把建树过程看成插入,插入第i个元素就在第i-1棵树的基础上新建结点然后得到第i棵树,那么询问区间[l,r]就是第r棵树上的信息对应减去第l-1棵树上的信息,然后再 ...

  7. POJ2104:K-th Number——题解

    http://poj.org/problem?id=2104 题目大意:求区间第k小. —————————————————————————— 主席树板子题. ……我看了半天现在还是一知半解的状态所以应 ...

  8. poj2104 K大数 划分树

    题意:给定一个数列,求一个区间的第K大数 模板题, 其中的newl, newr 有点不明白. #include <iostream> #include <algorithm> ...

  9. ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number

    A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...

  10. 整体二分初识--POJ2104:K-th Number

    n<=100000个数有m<=5000个询问,每次问区间第k大. 方法一:主席树!…… 方法二:整体二分. 整体二分一次性计算半个值域对一个区间的询问的贡献,然后根据“这半边的贡献在某个询 ...

随机推荐

  1. 深入JVM-垃圾回收概念与算法

    一.认识垃圾回收 谈到垃圾回收(Garbage Collection,简称GC),GC中的垃圾,特指存在于内存中的.不会再被使用的对象.对于内存空间的管理来说,识别和清理垃圾对象是至关重要的. 二.常 ...

  2. 自然语言16.1_Python自然语言处理学习笔记之信息提取步骤&分块(chunking)

    QQ:231469242 欢迎喜欢nltk朋友交流 http://www.cnblogs.com/undercurrent/p/4754944.html 一.信息提取模型 信息提取的步骤共分为五步,原 ...

  3. 安装ubuntu和安装ubuntu后要安装的软件列表

    安装ubuntu 老毛桃进入win pe修复启动项 在win pe下面制作ubuntu的安装盘,只用的软件是ultraISO 参考博客下面的分区的那篇文章  http://jingyan.baidu. ...

  4. JavaWeb学习笔记——第一个JSP文件

    必须加上第一句以用来指定编码,否则会出现乱码 <%@ page language="java" import="java.util.*" contentT ...

  5. C#----格式化字符串的操作

    class Program { static void Main(string[] args) { //DateTime dt = DateTime.Now; //Console.WriteLine( ...

  6. 在64位系统上不能安装Matlab notebook的解决方案

    在64位系统上不能安装Matlab notebook的解决方案 过程分解 第一步:安装好matlab(附:Matalab R2015a界面) 第二步:在matlab中执行命令 >>note ...

  7. 用IIS配置反向代理

    http://my.oschina.net/tanyixiu/blog/123832 目标服务器:targetServer 配置反向代理的服务器:reveseProxServer 1.确定最终访问的网 ...

  8. Hibernate.lock()方法中各种锁的区别

    悲观锁 它指的是对数据被外界修改持保守态度.假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁定状态,依靠数据库提供的锁机制来实 ...

  9. Saltstack pillar组件

     pillar组件 pillar也是Saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用,如模板.state.API等.在pillar中定义的数据与 ...

  10. Spring Ioc--Bean装配

    继前一篇IoC概述.Spring容器总结,接下来总结下Bean的装配过程. 要使引用程序中的Spring容器成功启动,需要同时具备以下3个条件: 1.Spring框架的类包,放在应用程序的类路径下. ...