例题:poj2104 http://poj.org/problem?id=2104

讲解,推荐博客:http://blog.sina.com.cn/s/blog_6022c4720102w03t.html

http://seter.is-programmer.com/posts/31907.html

http://www.cnblogs.com/shenben/p/5598371.html

数组版:

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=;
int l_child[N*],r_child[N*],sum[N*];
int n,m,a[N],hash[N],cnt,root[N];
int x,y,k;
void discrete()
{
sort(hash+,hash+n+);
cnt=unique(hash+,hash+n+)-(hash+);
for(int i=;i<=n;i++) a[i]=lower_bound(hash+,hash+cnt+,a[i])-hash;
}
int init()
{
int x=,f=;char c=getchar();
while(c<''||c>'') {if(c=='-') f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int query(int x,int y,int l,int r,int k)
{
if(l==r) return l;
int mid=l+r>>,tmp=sum[l_child[y]]-sum[l_child[x]];
if(tmp>=k) return query(l_child[x],l_child[y],l,mid,k);
else return query(r_child[x],r_child[y],mid+,r,k-tmp);
}
int tot=;
void build(int x,int &y,int l,int r,int v)
{
sum[y=++tot]=sum[x]+;
if(l==r) return;
int mid=l+r>>;
if(v<=mid)
{
r_child[y]=r_child[x];
build(l_child[x],l_child[y],l,mid,v);
}
else
{
l_child[y]=l_child[x];
build(r_child[x],r_child[y],mid+,r,v);
}
}
int main()
{
n=init();m=init();
for(int i=;i<=n;i++) a[i]=init(),hash[i]=a[i];
discrete();
//for(int i=1;i<=n;i++) printf("%d ",a[i]);
for(int i=;i<=n;i++) build(root[i-],root[i],,cnt,a[i]);
for(int i=;i<=m;i++)
{
x=init();y=init();k=init();
printf("%d\n",hash[query(root[x-],root[y],,cnt,k)]);
}
}

指针版:TLE

#include<cstdio>
#include<algorithm>
#define N 100001
using namespace std;
int n,m,a[N],hash[N];
int tot,cnt;
struct node
{
node * l,* r;
int sum;
};
node * root[N];
void discrete()
{
sort(a+,a+n+);
tot=unique(a+,a+n+)-(a+);
for(int i=;i<=n;i++) hash[i]=lower_bound(a+,a+n+,hash[i])-a;
}
inline node * build(node * pre,int l,int r,int w)
{
node *neww=new node();
//node * neww=(node *)malloc(sizeof(node));
neww->sum=pre->sum+;
if(l==r) return neww;
int mid=l+r>>;
if(w<=mid)
{
neww->r=pre->r;
neww->l=build(pre->l,l,mid,w);
}
else
{
neww->l=pre->l;
neww->r=build(pre->r,mid+,r,w);
}
return neww;
}
inline int query(node * x,node * y,int k,int l,int r)
{
if(l==r) return l;
int mid=l+r>>,tmp=y->l->sum-x->l->sum;
if(k<=tmp) return query(x->l,y->l,k,l,mid);
else return query(x->r,y->r,k-tmp,mid+,r);
}
node * null(int ll,int rr)
{
node *neww=new node();
//node * neww=(node *)malloc(sizeof(node));
neww->l=neww->r=NULL;
neww->sum=;
if(ll==rr) return neww;
int mid=ll+rr>>;
neww->l=null(ll,mid);
neww->r=null(mid+,rr);
return neww;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) {scanf("%d",&a[i]);hash[i]=a[i];}
discrete();
root[]=null(,n);
for(int i=;i<=n;i++) root[i]=build(root[i-],,n,hash[i]);
int x,y,k;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&k);
printf("%d\n",a[query(root[x-],root[y],k,,n)]);
}
}

主席树——求静态区间第k大的更多相关文章

  1. 主席树(静态区间第k大)

    前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...

  2. 可持久化线段树(主席树)——静态区间第k大

    主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...

  3. 主席树 - 查询某区间第 K 大

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

  4. 主席树入门——询问区间第k大pos2104,询问区间<=k的元素个数hdu4417

    poj2104找了个板子..,但是各种IO还可以进行优化 /* 找区间[l,r]第k大的数 */ #include<iostream> #include<cstring> #i ...

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

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

  6. 静态区间第k大(归并树)

    POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...

  7. poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板

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

  8. HDU3473--Minimum Sum(静态区间第k大)

    Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  9. 主席树学习笔记(静态区间第k大)

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

随机推荐

  1. 用js触发CSS3-transition过渡动画

    用js触发CSS3-transition过渡动画 经过这几天的工作,让我进一步的了解到CSS3的强大,原本许多需要js才能实现的动画效果,现在通过CSS3就能轻易实现了,但是CSS3也有自身的不足,例 ...

  2. linux内核数据结构之kfifo

    1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...

  3. 嵌入式服务器jetty,让你更快开发web

    概述 jetty是什么? jetty是轻量级的web服务器和servlet引擎. 它的最大特点是:可以很方便的作为嵌入式服务器. 它是eclipse的一个开源项目.不用怀疑,就是你常用的那个eclip ...

  4. iOS UIGestureRecognizer与UIMenuController(内容根据iOS编程)

    UIGestureRecognizer 对象会截取本应由视图处理的触摸事件.当某个UIGestureRecognizer对象识别出特定的手势后,就会向指定的对象发送指定的消息.iOS SDK默认提供若 ...

  5. mvc 重定向的几种方式

    在RouteConfig添加一个简单的路由 //新增路由 routes.MapRoute( name: "Article", url: "Detial/{id}" ...

  6. [C#] 多线程总结(结合进度条)

    线程生命周期(来源 w3cschool) 未启动状态:当线程实例被创建但 Start 方法未被调用时的状况. 就绪状态:当线程准备好运行并等待 CPU 周期时的状况. 不可运行状态: 已经调用 Sle ...

  7. Maven自定义绑定插件目标:创建项目的源码jar

    <build> <plugins> <!-- 自定义绑定,创建项目的源码jar --> <plugin> <groupId>org.apac ...

  8. Oracle SQL性能优化

    (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table) ...

  9. HashSet,TreeSet和LinkedHashSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  10. SQL中varchar和nvarchar的区别

    varchar(n)长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字节的实际长度,而不是 n 个字节. nvar ...