主席树,其实就是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. limit的用法

    limit子句可以用于强制select语句返回指定的记录数.limit接受一个或两个数字参数,参数必须是整数常量.如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最 ...

  2. python(二):使用multiprocessing中的常见问题

    简介在python的解释器中,CPython是应用范围最广的一种,其具有丰富的扩展包,方便了开发者的使用.当然CPython也不是完美的,由于全局解释锁(GIL)的存在,python的多线程可以近似看 ...

  3. linux的存储结构

    在linux中存储结构如下: Linux系统中的文件存储结构 那么在linux中每个目录都是什么含义呢 在linux中相对路径和绝对路径是必须要了解的一个概念 绝对路径(absolute path): ...

  4. emacs配置文件的基础知识 (转载)

    转自:http://blog.csdn.net/schumyxp/article/details/2278268 emacs的配置文件,叫作.emacs,是个隐藏文件,存在于当前用户的根目录下面,也就 ...

  5. P5168 xtq玩魔塔

    传送门 其实就是板子--只要会克鲁斯卡尔重构树和带修莫队就可以了 这么想着的我就调了将近一个下午-- 思路其实比较清晰,然而码量很大,细节贼多-- 不难看出只在最小生成树上走最优,于是建出克鲁斯卡尔重 ...

  6. poj2893 M*N puzzle 【n*m数码问题小结】By cellur925

    题目传送门 这个问题是来源于lydrainbowcat老师书上讲排序的一个扩展.当时讲的是奇数码问题,其实这种问题有两种问法:一种局面能否到另一种局面.到达目标局面的最小步数. 本文部分内容引用于ly ...

  7. win32 指令大全

    指令类型 助记符 (带*为特权指令) 对标志寄存器的影响 备注 说明 举例 ZF CF PF SF OF AF DF IF TF 数据传送类 数据传送 MOV 不影响标志位 Move MOV r/m3 ...

  8. swiper.js插件的使用

    swiper切换动画效果,需要先加载swiper.animate.min.js和animate.min.css. <!DOCTYPE html><html>    <he ...

  9. nginx用户统计

    1 概念 PV:页面访问量,即PageView,用户每次对网站的访问均被记录,用户对同一页面的多次访问,访问量累计. UV:独立访问用户数:即UniqueVisitor,访问网站的一台电脑客户端为一个 ...

  10. Hadoop体系结构管理

    一.查看Zookeeper信息 [hadoop@weekend01 ~]$zkServer.sh status JMX enabled by default Using config: /hadoop ...