poj 2104 静态主席树
我的第一道主席树(静态)。
先记下自己对主席树的理解:
主席树的作用是用于查询区间第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 静态主席树的更多相关文章
- HDU 2665 && POJ 2104(主席树)
http://poj.org/problem?id=2104 对权值进行建树(这个时候树的叶子是数组b的有序数列),然后二分查找原数列中每个数在有序数列中的位置(即第几小),对每一个前缀[1,i]建一 ...
- 主席树----POJ 2104(主席树裸题)(转)
首先来介绍一下我们需求:给你n个数,多次问你某个区间内的第k小是哪个数 主席树: 主席树的全名应该是 函数式版本的线段树.加上附带的一堆 technology.. ..总之由于原名字太长了,而且 “主 ...
- POJ 2104 【主席树】【区间第K大】
#include<stdio.h> #include<algorithm> #include<string.h> #define MAXN 100010 #defi ...
- poj 2104 (主席树写法)
//求第K的的值 1 #include<stdio.h> #include<iostream> #include<algorithm> #include<cs ...
- POJ 2104 静态找区间第k大
静态区间第k大的问题,往往可以利用主席树来解决 这是主席树的第一道题 主席树大概可以理解为在n个节点上都建立一棵线段树,但是想想会超出内存 每一个节点保存的线段树都记录当前整段前缀区间的信息 但是因为 ...
- POJ 2104 K-th Number 静态主席树(裸
题目链接:点击打开链接 题意: 给定n长的序列.q个询问 以下n个数字给出序列 每一个询问[l, r] k ,输出该区间中第k大的数 先建一个n个节点的空树.然后每次从后往前新建一棵树,依附原来的空树 ...
- 【静态主席树】POJ2104-K-th Number
求区间第k大.裸线段树. 莫队版本:☆ #include<iostream> #include<cstdio> #include<cstring> #include ...
- poj 2104(线段树)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 45653 Accepted: 15177 Ca ...
- poj 2104 (划分树模板)
Description You are working for Macrohard company in data structures department. After failing your ...
随机推荐
- 25、Python垃圾回收机制?
Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...
- Vue SPA 首屏加载优化实践
写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui ...
- xss自动化攻击
所需工具 [1.xssValidator] [2.phantomjs] [3.xss.js] /** * This is a basic phantomJS script that will be u ...
- ldconfig是一个动态链接库管理命令
ldconfig是一个动态链接库管理命令 为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/li ...
- ubuntu10.04 svn安装方法
ubuntu10.04 svn安装方法:sudo apt-get install subversion sudo apt-get install libneon27-dev orsudo apt-ge ...
- 72.Edit Distance---dp
题目链接:https://leetcode.com/problems/edit-distance/description/ 题目大意:找出两个字符串之间的编辑距离(每次变化都只消耗一步). 法一(借鉴 ...
- AttributeError: 'str' object has no attribute 'decode'
ue = e.decode('latin-1')修改为: ue = e.encode('ascii', 'strict')
- 记一次spring boot中MongoDB Prematurely reached end of stream的异常解决
在spring boot项目中使用了mongodb,当一段时间没有操作mongodb,下次操作mongodb时就会出现异常.异常如下: org.springframework.data.mongodb ...
- Nginx - 隐藏或修改版本号
1. 前言 无论是修改 Nginx 版本还是隐藏 Nginx 版本号,都是很简单的操作,对外来说,相对更安全些. 2. 修改 Nginx 版本号 对于修改 Nginx 版本号来说,需要在源码的基础上进 ...
- VMW虚拟机生成的文件说明
VMDK(VMWare Virtual Machine Disk Format)是虚拟机VMware创建的虚拟硬格式,文件存在于VMware文件系统中,被称为VMFS(虚拟机文件系统) NVRAM 非 ...