主席树,其实就是N颗线段树

只是他们公用了一部分节点(๑•̀ㅂ•́)و✧

我大部分的代码是从一位大佬的那里看到的

我这个垃圾程序连Poj2104上的数据都过不了TLE

so希望神犇能给我看看,

顺便给和我一样的底层人物一点指针的帮助

也许是 new 太慢了

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100100
using namespace std;
struct XDS{
int l,r,dat;
XDS *lc,*rc;
XDS(){l=r=dat=0,lc=rc=NULL;}
};XDS *ro[N];
int n,qn,num[N],val[N],len;
void prerun(){//这是离散化的预处理
sort(val+0,val+n);
len=unique(val+0,val+n)-val;
}
int fvind(int x){//离散化get
return lower_bound(val+0,val+len,x)-val+1;
}
void Empty_total(XDS *&rt,int l,int r){//以l为左,r为右处理一颗空树,初始化
rt=new XDS();
rt->l=l;
rt->r=r;
if(l==r)return ;
int mid=(l+r)/2;
Empty_total(rt->lc,l,mid);
Empty_total(rt->rc,mid+1,r);
}
void dfs(XDS *rt){//调试用的,不用管
if(rt==NULL)return;
cout<<rt<<" "<<rt->l<<" "<<rt->r<<" "<<rt->dat<<"\n";
dfs(rt->lc);
dfs(rt->rc);
}
void add(XDS *his,XDS *&nrt,int v){//his:从上一个转移过来,nrt :现在在搞的 (同位转移)增加一个|V:离散化后
if(his==NULL)return ;//结束
if(nrt==NULL)nrt=new XDS();//新开节点
int l=his->l;nrt->l=l;
int r=his->r;nrt->r=r;
if(l==r){
nrt->dat=his->dat+1;
return ;
}
int mid=(l+r)/2;
if(v<=mid){//值在左侧
nrt->rc=his->rc;//直接拿右侧
add(his->lc,nrt->lc,v);//查左
}
else{//值在右侧
nrt->lc=his->lc;//直接拿左侧
add(his->rc,nrt->rc,v);//查右
}
nrt->dat=nrt->lc->dat+nrt->rc->dat;
}
int query(XDS *lrt,XDS *rrt,int k){//在lrt与rrt之间查第K大
int l=1,r=len;//二分查找
while(l<r){
int mid=(l+r)/2;
int cnt=rrt->lc->dat-lrt->lc->dat;/*两个树的左子树差
即在这个区间内在[0,mid]范围内的增加值 */
if(cnt>=k){//比k个多,往左搜
r=mid;
lrt=lrt->lc;
rrt=rrt->lc;//同步浏览
}
else {//比k个少,往右
l=mid+1;
k-=cnt;
lrt=lrt->rc;
rrt=rrt->rc;
}
}
return l;
}
int main(){
scanf("%d%d",&n,&qn);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
val[i-1]=num[i];
}
prerun();
Empty_total(ro[0],1,len);
// dfs(ro[0]);
for(int i=1;i<=n;i++){
add(ro[i-1],ro[i],fvind(num[i]));
}
int a,b,c;
for(int i=1;i<=qn;i++){
scanf("%d%d%d",&a,&b,&c);
// cout<<query(ro[a-1],ro[b],c)<<endl;
printf("%d\n",val[query(ro[a-1],ro[b],c)-1]);
}
return 0;
}

主席树-指针实现-找第k小数的更多相关文章

  1. 算法打基础——顺序统计(找第k小数)

    这次主要是讲如何在线性时间下找n个元素的未排序序列中第k小的数.当然如果\(k=1 or k=n\),即找最大最小 数,线性时间内遍历即可完成,当拓展到一般,如中位数时,相关算法就值得研究了.这里还要 ...

  2. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  3. SPOJ COT Count on a tree(树上主席树 + LCA 求点第k小)题解

    题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点 ...

  4. 【树状数组套主席树】带修改区间K大数

    P2617 Dynamic Rankings 题目描述给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+ ...

  5. HDU 2665(主席树,无修改第k小)

    Kth number                                                 Time Limit: 15000/5000 MS (Java/Others)   ...

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

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

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

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

  8. 主席树铺垫——总区间第k小

    题目描述(口糊) 先给定一个长度为n的数列,然后给m次操作,每次输入b,求第b小的数. 样例输入 5 7 4 10 9 23 5 1 2 3 4 5 样例输出 4 7 9 10 23 数据范围及温馨提 ...

  9. 主席树——求静态区间第k大

    例题:poj2104 http://poj.org/problem?id=2104 讲解:http://blog.sina.com.cn/s/blog_6022c4720102w03t.html ht ...

随机推荐

  1. DLL远程注入实例

    一般情况下,每个进程都有自己的私有空间,理论上,别的进程是不允许对这个私人空间进行操作的,但是,我们可以利用一些方法进入这个空间并进行操作,将自己的代码写入正在运行的进程中,于是就有了远程注入了. 对 ...

  2. C#:C# 运算符

    ylbtech-C#:C# 运算符 1.返回顶部 1. C# 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C# 有丰富的内置运算符,分类如下: 算术运算符 关系运算符 逻辑运算符 位 ...

  3. Centos添加jdk环境变量

    假设将jdk解压到/opt/jdk1.8.0_131. echo "export JAVA_HOME=/opt/jdk1.8.0_131" >> /etc/profil ...

  4. STL--lower_bound()&upper_bound();

    又是两个黑科技一般的存在. 首先我们来介绍一下这两个函数: ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& ...

  5. View Programming Guide for iOS ---- iOS 视图编程指南(三)---Windows

    Windows Every iOS application needs at least one window—an instance of the UIWindow class—and some m ...

  6. Cocos2d-html5游戏开发,常用工具集合

    代码编辑器IDEWebStorm (Windows, Mac) Cocos2d-html5官方团队在用,非常优秀的工具,请大家支持正版动画编辑器 Animation EditorSpriteHelpe ...

  7. Visual Studio 的Build Event 使用

    rmdir Configuration mkdir Configuration Copy "$(ProjectDir)Configuration\Spec.config" &quo ...

  8. bzoj 4240: 有趣的家庭菜园【树状数组+贪心】

    以为是逆序对数-- 实际上,原数组移动若干次后我们会得到一个新的下标序列,需要的移动次数是这个新下标序列的逆序对数 然后我们要让这个最小,考虑贪心先按h把下标排一遍序,然后每次询问到一种值的时候,对每 ...

  9. TensorFlow图像处理函数

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 图像编码处理+图像大小调整+图像翻转+图像色彩调整+处理标注框 #!/usr/bin/env python # - ...

  10. hbase-shell + hbase的java api

    本博文的主要内容有 .HBase的单机模式(1节点)安装 .HBase的单机模式(1节点)的启动 .HBase的伪分布模式(1节点)安装   .HBase的伪分布模式(1节点)的启动    .HBas ...