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

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

主席树的作用是用于查询区间第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. wordpress 模板制作之一

    WP模板工作原理图:

  2. Android Service使用简单介绍

    作为一个android初学者,经常对service的使用感到困惑.今天结合Google API 对Service这四大组件之一,进行简单使用说明. 希望对和我一样的初学者有帮助,如有不对的地方,也希望 ...

  3. 残差网络(Residual Network)

    一.背景 1)梯度消失问题 我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新. 可以看到,假设现在需要更 ...

  4. 记一次powershell反混淆(2)

    样本地址 https://www.hybrid-analysis.com/sample/4b4b8b13c264c8f7d7034060e0e4818a573bebc576a94d7b13b4c174 ...

  5. Mysql储存过程2:变量定义与参数传递

    #储存过程 中的变量定义 declare 变量名 类型 可选类型 -- 跟建表差不多 create procedure p() begin ); ; select age+number; end$ / ...

  6. JAVA 之 Tomcat知识框架【转】

    一.Tomcat服务器(很熟悉) 1.Web开发概述 javaSE: javaEE:13种 javaME: JavaEE规范: 13种技术的总称.Servlet/Jsp JDBC JNDI JTA.. ...

  7. pip安装使用详解【转】

    转自:pip安装使用详解 – 运维生存时间http://www.ttlsa.com/python/how-to-install-and-use-pip-ttlsa/ pip类似RedHat里面的yum ...

  8. JVM的分区+查看GC对象是否存活+3种GC算法+7种垃圾收集器+如何减少GC次数

    一.JVM的分区:   1.程序计数器(私有) 程序计数器是一块较小的内存分区,你可以把它看做当前线程所执行的字节码的指示器. 在虚拟机的概念模型里,字节码解释器工作时,就是通过改变计数器的值来选择下 ...

  9. Windows搭建RobotFramework环境(一)

    Robot Framework官网 http://robotframework.org/http://robotframework.org/ 安装说明 https://github.com/robot ...

  10. VMware-workstation-6.5.2-156735.exe

    480HD-KPZ2X-TA56C-4YTQQ VMware 12 专业版永久许可证密钥 5A02H-AU243-TZJ49-GTC7K-3C61N