博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
主席树——求静态区间第k大
阅读量:5007 次
发布时间:2019-06-12

本文共 2987 字,大约阅读时间需要 9 分钟。

例题:poj2104 

讲解,推荐博客:

     

数组版:

#include
#include
using namespace std;const int N=100001;int l_child[N*18],r_child[N*18],sum[N*18];int n,m,a[N],hash[N],cnt,root[N];int x,y,k;void discrete(){ sort(hash+1,hash+n+1); cnt=unique(hash+1,hash+n+1)-(hash+1); for(int i=1;i<=n;i++) a[i]=lower_bound(hash+1,hash+cnt+1,a[i])-hash;}int init(){ int x=0,f=1;char c=getchar(); while(c<'0'||c>'9') {
if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';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>>1,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+1,r,k-tmp);}int tot=0;void build(int x,int &y,int l,int r,int v){ sum[y=++tot]=sum[x]+1; if(l==r) return; int mid=l+r>>1; 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+1,r,v); }}int main(){ n=init();m=init(); for(int i=1;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=1;i<=n;i++) build(root[i-1],root[i],1,cnt,a[i]); for(int i=1;i<=m;i++) { x=init();y=init();k=init(); printf("%d\n",hash[query(root[x-1],root[y],1,cnt,k)]); }}

 指针版:TLE

#include
#include
#define N 100001using 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+1,a+n+1); tot=unique(a+1,a+n+1)-(a+1); for(int i=1;i<=n;i++) hash[i]=lower_bound(a+1,a+n+1,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+1; if(l==r) return neww; int mid=l+r>>1; 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+1,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>>1,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+1,r);}node * null(int ll,int rr){ node *neww=new node(); //node * neww=(node *)malloc(sizeof(node)); neww->l=neww->r=NULL; neww->sum=0; if(ll==rr) return neww; int mid=ll+rr>>1; neww->l=null(ll,mid); neww->r=null(mid+1,rr); return neww;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) {scanf("%d",&a[i]);hash[i]=a[i];} discrete(); root[0]=null(1,n); for(int i=1;i<=n;i++) root[i]=build(root[i-1],1,n,hash[i]); int x,y,k; for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&k); printf("%d\n",a[query(root[x-1],root[y],k,1,n)]); }}

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/6259781.html

你可能感兴趣的文章
你想到了,就有别人去实现,那你为什么不去实现呢
查看>>
OSI与TCP/IP模型
查看>>
【IT笔试面试题整理】丑数
查看>>
敏捷开发一千零一问系列之六:业务人员怎样参与开发?
查看>>
双向链表
查看>>
RAL调用
查看>>
freemarker 设置文本内容超过一定长度 用省略号代替
查看>>
jQuery.reveal弹出层使用
查看>>
学习spring in action 第一天
查看>>
asp.net上传功能(单文件,多文件,自定义生成缩略图,水印)
查看>>
bash: ./t.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录
查看>>
云计算设计模式(八)——外部配置存储模式
查看>>
C++ Primer 有感(复制控制)
查看>>
[转]深入理解闭包(一)
查看>>
经典SQL语句大全(绝对的经典)
查看>>
设计者使用最多的前20专门设计LOGO的免费字体
查看>>
TCP三次握手、四次握手
查看>>
认识System,System32,Syswow64
查看>>
Jmeter如何把CSV文件的路径设置成一个变量,且变量的值是一个相对路径
查看>>
免费的自动构建CI
查看>>