主席树,其实就是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. GYM 100741A Queries

    传送门 题目大意: 一个长度为n的序列,q次三种操作 +p  r:下标为p的数+r -p r:下标为p的数-r s l r mod [L,R]中有多少数%m=mod,m已经给出 题解: 开十个树状数组 ...

  2. codevs3285转圈游戏

    传送门 3285 转圈游戏 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descript ...

  3. JAVA泛型与可变参数

    泛型的引入: 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题.也就存在这隐患,所以Java提供了泛型来解决这个安全问题. 格式: 泛型类:public class ...

  4. 使用git rebase合并多次commit

    使用git rebase合并多次commit 聊下 git rebase -i

  5. Vue scrollBehavior 滚动行为

    使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样. vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动. 注意: 这个功能只 ...

  6. HDU 5881 Tea (模拟)

    题意:有一壶水, 体积在 LLL 和 RRR 之间, 有两个杯子, 你要把水倒到两个杯子里面, 使得杯子水体积几乎相同(体积的差值小于等于1), 并且使得壶里剩下水体积不大于1. 你无法测量壶里剩下水 ...

  7. E20180407-hm

    queue   n. (人或车辆) 行列,长队; 辫子;   vi. (人.车等) 排队等候;   vt. (使) 排队,列队等待; compatible  adj. 兼容的,相容的; 和谐的,协调的 ...

  8. python __builtins__ tuple类 (68)

    68.'tuple', 转换为元组类型 class tuple(object) | tuple() -> empty tuple | tuple(iterable) -> tuple in ...

  9. echartShow

    echartShow 基于echart和bootstrap的大屏展示 以下是已经运用的成品图片.有一些数据运用的是json文件,实际成品中运用的是真实数据,除了公司内网访问不了.  需注意的地方 图表 ...

  10. nginx memcache缓存

    1 基本 在一个lnmp架构中,nginx遇到动态资源,会反向代理,把请求发送到后端的php-fpm服务,php-fpm从mysql里读取数据,生产网页,然后返回给client. 如果流量大,php- ...