[POJ 2104]K-th Number【模板】(主席树)
题目背景
这是个非常经典的主席树入门题——静态区间第K小
数据已经过加强,请使用主席树。同时请注意常数优化
题目描述
如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值。
输入输出格式
输入格式:
第一行包含两个正整数N、M,分别表示序列的长度和查询的个数。
第二行包含N个正整数,表示这个序列各项的数字。
接下来M行每行包含三个整数l,r,k l, r, kl,r,k , 表示查询区间[l,r][l, r][l,r]内的第k小值。
输出格式:
输出包含k行,每行1个正整数,依次表示每一次查询的结果
输入输出样例
5 5
25957 6405 15770 26287 26465
2 2 1
3 4 1
4 5 1
1 2 2
4 4 1
6405
15770
26287
25957
26287
说明
数据范围:
对于20%的数据满足:1≤N,M≤10
对于50%的数据满足:1≤N,M≤1033
对于80%的数据满足:1≤N,M≤1055
对于100%的数据满足:1≤N,M≤2⋅1055
对于数列中的所有数aii,均满足−109≤ai≤109-{10}^9 \leq a_i \leq {10}^9−109≤ai≤109
样例数据说明:
N=5,数列长度为5,数列从第一项开始依次为25957,6405,15770,26287,26465
第一次查询为[2,2]区间内的第一小值,即为6405
第二次查询为[3,4]区间内的第一小值,即为15770
第三次查询为[4,5]区间内的第一小值,即为26287
第四次查询为[1,2]]区间内的第二小值,即为25957
第五次查询为[4,4]区间内的第一小值,即为26287
主席树真奇妙
给出两位巨佬的链接
第一个很详细的解释了主席树
第二个给出了此题的所有做法
http://www.cnblogs.com/zyf0163/p/4749042.html
http://www.cnblogs.com/NaVi-Awson/p/7325571.html
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
struct Node
{
int key;
Node *ch[];
}S[N*],*pos=S;
Node *root[N+];
int a[N+],b[N+],n,m,sz,rem[N+];
void build(Node* &rt,int l,int r)
{
rt=++pos;
rt->key=;
if (l==r) return;
int mid=(l+r)/;
build(rt->ch[],l,mid);
build(rt->ch[],mid+,r);
}
void insert(Node* &rt,int l,int r,int k)
{
Node *x=rt;
rt=++pos;
rt->ch[]=x->ch[];
rt->ch[]=x->ch[];
rt->key=x->key+;
if (l==r) return;
int mid=(l+r)/;
if (k<=mid) insert(rt->ch[],l,mid,k);
else insert(rt->ch[],mid+,r,k);
}
int query(Node* rl,Node* rr,int l,int r,int k)
{
if (l==r) return l;
int mid=(l+r)/;
int x=rr->ch[]->key-rl->ch[]->key;
if (x>=k) return query(rl->ch[],rr->ch[],l,mid,k);
else return query(rl->ch[],rr->ch[],mid+,r,k-x);
}
int main()
{int i,j,x,y,k;
cin>>n>>m;
for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+,b+n+);
sz=unique(b+,b+n+)-(b+);
for (i=;i<=n;i++)
a[i]=lower_bound(b+,b+sz+,a[i])-b;
build(root[],,n);
for (i=;i<=n;i++)
{
root[i]=root[i-];
insert(root[i],,n,a[i]);
}
while (m--)
{
scanf("%d%d%d",&x,&y,&k);
int ans=query(root[x-],root[y],,n,k);
printf("%d\n",b[ans]);
}
}
[POJ 2104]K-th Number【模板】(主席树)的更多相关文章
- POJ 2104:K-th Number(主席树静态区间k大)
题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var ...
- poj 2104 K-th Number(主席树,详细有用)
poj 2104 K-th Number(主席树) 主席树就是持久化的线段树,添加的时候,每更新了一个节点的线段树都被保存下来了. 查询区间[L,R]操作的时候,只需要用第R棵树减去第L-1棵树就是区 ...
- POJ 2104 K-th Number(主席树模板题)
http://poj.org/problem?id=2104 题意:求区间$[l,r]$的第k小. 思路:主席树不好理解啊,简单叙述一下吧. 主席树就是由多棵线段树组成的,对于数组$a[1,2...n ...
- 【POJ 2104】 K-th Number 主席树模板题
达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...
- POJ 2104&HDU 2665 Kth number(主席树入门+离散化)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 50247 Accepted: 17101 Ca ...
- POJ 2104 K-th Number(主席树——附讲解)
Description You are working for Macrohard company in data structures department. After failing your ...
- poj 2104 K-th Number(主席树)
Description You are working for Macrohard company in data structures department. After failing your ...
- poj 2104 K-th Number(主席树
Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 59058 Accepted: 20529 Case Time Limi ...
- poj 2104: K-th Number 【主席树】
题目链接 学习了一下主席树,感觉具体算法思路不大好讲.. 大概是先建个空线段树,然后类似于递推,每一个都在前一个“历史版本”的基础上建立一个新的“历史版本”,每个历史版本只需占用树高个空间(好神奇!) ...
- HDU 2665 Kth number(主席树静态区间第K大)题解
题意:问你区间第k大是谁 思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的. 具体可以看q学姐的B站视频 代码: #include<cmath> #i ...
随机推荐
- ExecutorService,另一种服务,线程
http://heipark.iteye.com/blog/1393847 Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得 博客 ...
- 利用python 创建XML文件
#coding=utf-8 from xml.etree import ElementTree import pdb def printNodeInfo(node): #node.tag 标签名称 # ...
- 前端面试题之css
1.请列出几个具有继承特性的css属性 font-family font-size color line-height text-align text-indent 2.阐述display: ...
- MyBatis 中使用数据库查询别名进行映射
方法1 XXMapper.xml <mapper namespace="com.hfepc.dao.andon.AndonExceptionKanbanVOMapper" & ...
- JAVA_SE基础——12.运算符的优先级
优先级 操作符 含义 关联性 用法 ---------------------------------------------------------------- 1 [ ] 数组下标 左 arra ...
- 看漫画学Flux
原文地址:A cartoon guide to Flux - by Lin Clark Flux在目前web开发中最受欢迎也较不被人理解,本文会以简单易懂的方式解释它. 出现问题 首先,我要声明Flu ...
- 19届华为实习生笔试之判断iPv6地址类型
题二: 答案: #coding=utf-8 import re,sys str = sys.stdin.readline().strip() def regex(str): result = &quo ...
- MySQLdb、 flask-MySQLdb 、MySQL-python 安装失败
今天在学习flask的时候,学习到数据库部分,连接mysql生成表,运行程序报错误:No module named MySQLdb 此时 需要安装 以下两个中任何一个 pip install flas ...
- linux搭建django项目基本步骤
一 linux下django基本项目搭建流程:M model 用于与数据库交互V view 接受前台请求 调用model获取结果,调用T获取页面,返回给前台T template 接受view的要求 生 ...
- Lintcode373 Partition Array by Odd and Even solution 题解
[题目描述] Partition an integers array into odd number first and even number second. 分割一个整数数组,使得奇数在前偶数在后 ...