我的第一道主席树(静态)。

先记下自己对主席树的理解:

主席树的作用是用于查询区间第k大的元素(初始化nlog(n),查询log(n))

主席树=可持续线段树+前缀和思想

主席树实际上是n棵线段树(由于是可持续化线段树,所以实际上是n个长度为log(n)的链),第i棵线段树保存的是a[1]~a[i]这i个数的值域线段树,每个节点维护的是该值域中元素个数,这个是可以相减的,所以建完树后,查询[lf,rg]的第k大时,保存当前查询的值域区间在lf-1和rg这两棵线段树中的节点u,v(不理解看代码),再向下查找时,根据

size[v]-size[u]与k(这里的k是在当前值域的第k大)的大小关系决定向值域的左走还是右走。

(注意空间!)

 #include <cstdio>
#include <algorithm>
#define maxn 100010
#define maxs 18*maxn
using namespace std; struct SegTree {
int son[maxs][], siz[maxs], ntot;
int root[maxn], vmin, vmax; int modify( int v, int nd, int lf, int rg ) {
if( lf>=rg ) return ;
int newd = ++ntot;
if( lf+==rg ) {
siz[newd] = siz[nd]+;
son[newd][] = son[newd][] = ;
return newd;
}
int mid = (lf+rg)>>;
if( v<mid ) {
son[newd][] = modify( v, son[nd][], lf, mid );
son[newd][] = son[nd][];
} else {
son[newd][] = son[nd][];
son[newd][] = modify( v, son[nd][], mid, rg );
}
siz[newd] = siz[son[newd][]]+siz[son[newd][]];
return newd;
}
int query( int k, int u, int v, int lf, int rg ) {
int ls = siz[son[v][]]-siz[son[u][]];
if( lf+==rg ) return lf;
int mid = (lf+rg)>>;
if( k<=ls ) return query(k,son[u][],son[v][],lf,mid);
else return query(k-ls,son[u][],son[v][],mid,rg);
} void init( int n ) {
ntot = ;
vmin = ;
vmax = n+;
root[] = ;
}
void modify( int pos, int val ) {
root[pos] = modify( val, root[pos-], vmin, vmax );
}
int query( int k, int lf, int rg ) {
return query( k, root[lf-], root[rg], vmin, vmax );
}
}; int n, m;
SegTree T;
int a[maxn];
int sval[maxn], tot; int main() {
scanf( "%d%d", &n, &m );
T.init(n);
for( int i=; i<=n; i++ ) {
scanf( "%d", a+i );
sval[i] = a[i];
}
sort( sval+, sval++n );
tot = unique( sval+, sval++n ) - sval;
for( int i=; i<=n; i++ ) {
int dv = lower_bound(sval+,sval++tot,a[i])-sval;
T.modify( i, dv );
}
for( int i=,k,lf,rg; i<=m; i++ ) {
scanf( "%d%d%d", &lf, &rg, &k );
printf( "%d\n", sval[T.query(k,lf,rg)] );
}
}

poj 2104 静态主席树的更多相关文章

  1. HDU 2665 && POJ 2104(主席树)

    http://poj.org/problem?id=2104 对权值进行建树(这个时候树的叶子是数组b的有序数列),然后二分查找原数列中每个数在有序数列中的位置(即第几小),对每一个前缀[1,i]建一 ...

  2. 主席树----POJ 2104(主席树裸题)(转)

    首先来介绍一下我们需求:给你n个数,多次问你某个区间内的第k小是哪个数 主席树: 主席树的全名应该是 函数式版本的线段树.加上附带的一堆 technology.. ..总之由于原名字太长了,而且 “主 ...

  3. POJ 2104 【主席树】【区间第K大】

    #include<stdio.h> #include<algorithm> #include<string.h> #define MAXN 100010 #defi ...

  4. poj 2104 (主席树写法)

    //求第K的的值 1 #include<stdio.h> #include<iostream> #include<algorithm> #include<cs ...

  5. POJ 2104 静态找区间第k大

    静态区间第k大的问题,往往可以利用主席树来解决 这是主席树的第一道题 主席树大概可以理解为在n个节点上都建立一棵线段树,但是想想会超出内存 每一个节点保存的线段树都记录当前整段前缀区间的信息 但是因为 ...

  6. POJ 2104 K-th Number 静态主席树(裸

    题目链接:点击打开链接 题意: 给定n长的序列.q个询问 以下n个数字给出序列 每一个询问[l, r] k ,输出该区间中第k大的数 先建一个n个节点的空树.然后每次从后往前新建一棵树,依附原来的空树 ...

  7. 【静态主席树】POJ2104-K-th Number

    求区间第k大.裸线段树. 莫队版本:☆ #include<iostream> #include<cstdio> #include<cstring> #include ...

  8. poj 2104(线段树)

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

  9. poj 2104 (划分树模板)

    Description You are working for Macrohard company in data structures department. After failing your ...

随机推荐

  1. thinkphp 漂亮的分页样式

    ---恢复内容开始--- 首先:需要两个文件 page.class.php page.css 1.在TP原有的 page.class.php 文件稍作修改几条代码就可以了, 修改过的地方我会注释, 2 ...

  2. weblogic 开启注意问题

    1.关闭防火墙 service iptables stop chkconfig iptables off 2.weblogic unable to get file lock问题 我的解决办法是ps ...

  3. python基础之上下文管理器

    前言 关于计算器运行的上下文的概念,我的理解也不是很深:按我的理解就是程序在运行之前,其所需要的资源,运行环境等都会被序列化,然后加入到CPU的任务队列中,等待调度系统分配时间片执行.下面谈谈pyth ...

  4. 教你如何修改FireFox打开新标签页(NewTab Page)的行列数

    FireFox的打开新建标签页(即NewTab Page)默认只能显示3x3个网站缩略图,这9个自定义的网站,非常方便快捷,什么hao123的弱爆了,本人从未用过此类导航网站,曾经用过的也只是abou ...

  5. [转载]锁无关的数据结构与Hazard指针——操纵有限的资源

    Lock-Free Data Structures with Hazard Pointers 锁无关的数据结构与Hazard指针----操纵有限的资源 By Andrei Alexandrescu a ...

  6. Python学习笔记——迭代器和生成器

    1.手动遍历迭代器 使用next函数,并捕获StopIteration异常. def manual_iter(): with open('./test.py') as f: try: while Tr ...

  7. html基础--css基本属性

    HTML基础--css基本属性     <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  8. Java容器概述

    如果一个程序只包含固定数量的且其生命期都是己知的对象. 那么这是一个非常简单的程序. 通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型.为解 ...

  9. centos7 lvs+keepalived nat模式

    1.架构图   3.地址规划 主机名 内网ip 外网ip lvs-master 192.168.137.111(仅主机)eth1 172.16.76.111(桥接)eth0 lvs-slave 192 ...

  10. hive学习(五) 应用案例

    1.实现struct数据结构例子 1.1创建student表 create table student( id int, info struct<name:string,age:int> ...