主席树——求静态区间第k大
例题: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大的更多相关文章
- 主席树(静态区间第k大)
前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...
- 可持久化线段树(主席树)——静态区间第k大
主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...
- 主席树 - 查询某区间第 K 大
You are working for Macrohard company in data structures department. After failing your previous tas ...
- 主席树入门——询问区间第k大pos2104,询问区间<=k的元素个数hdu4417
poj2104找了个板子..,但是各种IO还可以进行优化 /* 找区间[l,r]第k大的数 */ #include<iostream> #include<cstring> #i ...
- POJ 2104 【主席树】【区间第K大】
#include<stdio.h> #include<algorithm> #include<string.h> #define MAXN 100010 #defi ...
- 静态区间第k大(归并树)
POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- HDU3473--Minimum Sum(静态区间第k大)
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- 主席树学习笔记(静态区间第k大)
题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...
随机推荐
- -Android -线程池 批量上传图片 -附php接收代码
(出处:http://www.cnblogs.com/linguanh/) 目录: 1,前序 2,类特点 3,用法 4,java代码 5,php代码 1,前序 还是源于重构,看着之前为赶时间写着的碎片 ...
- 你真的会玩SQL吗?查询指定节点及其所有父节点的方法
--查询ID = '009'的所有父节点 ' ;WITH T AS ( SELECT ID , PID , NAME FROM TB WHERE ID = @ID UNION ALL SELECT A ...
- ASP.NET Core 中文文档 第四章 MVC(2.3)格式化响应数据
原文:Formatting Response Data 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) ASP.NET Core MVC 内建支持对相应数据( ...
- Centos 上 Tengine安装
安装步骤: 1.系统环境 1.1 更新系统 [root@centos ~]# yum update -y 1.2 查看环境 [root@centos ~]# cat /etc/redhat-relea ...
- 谈谈枚举的新用法——java
问题的由来 前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了! 事情是这样的,做过游戏的都知道,buff,需要分类型 ...
- JQuery Sizzle引擎源代码分析
最近在拜读艾伦在慕课网上写的JQuery课程,感觉在国内对JQuery代码分析透彻的人没几个能比得过艾伦.有没有吹牛?是不是我说大话了? 什么是Sizzle引擎? 我们经常使用JQuery的选择器查询 ...
- MongoDB初识
参考: MongoDB资料汇总专题:
- Lambda 表达式递归用法实例
注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的. Windows下查找子孙窗口实例: HWND FindDescendantWindows(HWND hWndParent, LPC ...
- Python 基础之四初识Python数据类型
数字 Int,整型 Float,浮点型 Long,长整型 布尔 字符串 列表 元组 字典 1.数字 INT(整型) 在32位系统上,整数的位数为32位,取值范围为-2**31~2**31-1,即-21 ...
- nodejs微信公众号快速开发|自定义关键字回复
一点说明: nodejs 微信api 扩展,集成大部分功能. 案例 https://github.com/leiroc/node-wxeasy-example 上传example中文件到服务器 ,然后 ...