例题: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. IDDD 实现领域驱动设计-理解领域和子域

    上一篇:<IDDD 实现领域驱动设计-一个简单业务用例的回顾和理解> 在<实现领域驱动设计>第二章的前半部分内容中,提到领域和子域的概念,并且作者把这两者又进行了细致的区分,其 ...

  2. jQuery-template.js学习

    花了点时间,看了下jQuery-template.js,不多废话,先上结构 jQuery.each({..},function(){}) jQuery.fn.extend({..}) jQuery.e ...

  3. OCP考点实战演练01-备份恢复篇

    本系列宗旨:真正掌握OCP考试中所考察的技能,坚决不做Paper OCP! 实验环境:RHEL 6.4 + Oracle 11.2.0.4 OCP考点实战演练01-备份恢复篇 1.数据库开启归档 2. ...

  4. 探寻 JavaScript 逻辑运算符(与、或)的真谛

    十二月已经过半,冬季是一个美妙的季节,寒冷的空气逼得人们不得不躲在安逸舒适的环境里生活.冬季会给人一种安静祥和的氛围,让人沉浸在其中,仿佛是一个旧的阶段的结束,同时也是一个新的阶段的开始.这么说来,西 ...

  5. 在Ubuntu|CentOS上安装Shutter截图工具及快捷键设置

    简介 Shutter前身叫GScrot,它是一款相当棒的截图软件. 通过Shutter,你可以截取包括选定区域.全屏幕.窗口.窗口内的控件甚至网页的图像.通过内置的强大插件机制,你可以在截图后,对图像 ...

  6. 文本框focus之后高亮背景颜色

    看效果:Html: CSS: jQuery: 或者使用连写法:

  7. java web学习总结(二十六) -------------------JSP属性范围

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  8. List Set Map

    List Set 都是接口,都继承了Collection接口 ArrayList LinkList 直接实现了List接口 HashSet 实现了Set接口  TreeSet继承父类AbstractS ...

  9. ArcGIS Engine开发之视图同步

    数据视图与布局视图的同步 数据视图与布局视图的同步,首先要保证数据的一致性,其次就是数据显示范围的一致性.该同步主要涉及IMapControl接口的OnMapReplaced事件和OnAfterScr ...

  10. iOS 应用程序生命周期

    开发应用程序都要了解其生命周期. 今天我们接触一下iOS应用程序的生命周期, iOS的入口在main.m文件: int main(int argc, char * argv[]) { @autorel ...