例题: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. 用CIL写程序:从“call vs callvirt”看方法调用

    前文回顾:<用CIL写程序系列> 前言: 最近的时间都奉献给了加班,距离上一篇文章也有半个多月了.不过在上一篇文章<用CIL写程序:定义一个叫“慕容小匹夫”的类>中,匹夫和各位 ...

  2. php内核分析(五)-zval

    这里阅读的php版本为PHP-7.1.0 RC3,阅读代码的平台为linux 实际上,从这个函数开始,就已经进入到了zend引擎的范围了. zend_eval_string_ex(exec_direc ...

  3. UWP简单示例(二):快速开始你的3D编程

    准备 IDE:Visual Studio 2015 了解并学习:SharpDx官方GitHub 推荐Demo:SharpDX_D3D12HelloWorld 第一节 世界 世界坐标系是一个特殊的坐标系 ...

  4. Lua 安全调用 metatable 的简单应用

    事情的经过 我们的项目中存在好几个战斗界面,不过界面中的内容略有不同.跟同事出去吃饭的时候,他问我.我们现在的战斗界面.有很多是重复的,但是也有偶尔几个地方不太一样.我在战斗过程中驱动这些界面的时候. ...

  5. Redis简单案例(三) 连续登陆活动的简单实现

    连续登陆活动,或许大家都不会陌生,简单理解就是用户连续登陆了多少天之后,系统就会送一些礼品给相应的用户.最常见的 莫过于游戏和商城这些.游戏就送游戏币之类的东西,商城就送一些礼券.正值国庆,应该也有不 ...

  6. 在DevExpress程序中使用SplashScreenManager控件实现启动闪屏和等待信息窗口

    在我很早的WInform随笔<WinForm界面开发之"SplashScreen控件">有介绍如何使用闪屏的处理操作,不过那种是普通WInform和DevExpress ...

  7. 你必须知道的Microsoft SQL Server一

    不知道为什么我Win10环境下安装的Sqlserver2012,智能提示的功能基本上没有用,没办法,我还是选择安装插件SQL Prompt 5吧.下载地址:http://www.uzzf.com/so ...

  8. getRequestDispatcher()与sendRedirect()的区别

    1.request.getRequestDispatcher()是请求转发,前后页面共享一个request ; response.sendRedirect()是重新定向,前后页面不是一个request ...

  9. Android 7.1 App Shortcuts使用

    Android 7.1 App Shortcuts使用 Android 7.1已经发了预览版, 这里是API Overview: API overview. 其中App Shortcuts是新提供的一 ...

  10. iOS开发中的数学函数

    在iOS开发当中...我们往往会涉及到一些算法...为了节省一些时间...让APP很快地被开发出来...我们需要对各类函数有一定的了解...接下来...我把部分常用函数分享出来...希望能帮到大家.. ...