Online Judge 2014 K-th Number -主席树
You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able to return quickly k-th order statistics in the array segment.
That is, given an array a[1...n] of different integer numbers, your program must answer a series of questions Q(i, j, k) in the form: "What would be the k-th number in a[i...j] segment, if this segment was sorted?"
For example, consider the array a = (1, 5, 2, 6, 3, 7, 4). Let the question be Q(2, 5, 3). The segment a[2...5] is (5, 2, 6, 3). If we sort this segment, we get (2, 3, 5, 6), the third number is 5, and therefore the answer to the question is 5.InputThe first line of the input file contains n --- the size of the array, and m --- the number of questions to answer (1 <= n <= 100 000, 1 <= m <= 5 000).
The second line contains n different integer numbers not exceeding 10 9 by their absolute values --- the array for which the answers should be given.
The following m lines contain question descriptions, each description consists of three numbers: i, j, and k (1 <= i <= j <= n, 1 <= k <= j - i + 1) and represents the question Q(i, j, k).OutputFor each question output the answer to it --- the k-th number in sorted a[i...j] segment.
Sample Input
7 3
1 5 2 6 3 7 4
2 5 3
4 4 1
1 7 3
Sample Output
5
6
3
Hint
This problem has huge input,so please use c-style input(scanf,printf),or you may got time limit exceed.
很裸的主席树模板题。不知道可不可以用O(n1.5log2n)的莫队加平衡树来做。
如果用下面这段代码去过poj的话会T掉,如果不是用new动态分配内存而是直接分配一个数组,在数组中储存所有节点可能就可以过了。
Code
/**
* OpenJudge
* Bailian#2104
* Accepted
* Time:2247ms
* Memory:65536k
*/
#include<iostream>
#include<fstream>
#include<sstream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cctype>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef bool boolean;
#define smin(a, b) (a) = min((a), (b))
#define smax(a, b) (a) = max((a), (b))
template<typename T>
inline void readInteger(T& u){
char x;
int aFlag = ;
while(!isdigit((x = getchar())) && x != '-' && x != -);
if(x == -){
ungetc(x, stdin);
return;
}
if(x == '-'){
x = getchar();
aFlag = -;
}
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
u *= aFlag;
} typedef class SegTreeNode{
public:
int s; //size
SegTreeNode *left, *right;
SegTreeNode():left(NULL), right(NULL), s(){ }
void pushUp(){
this->s += this->left->s + this->right->s;
}
}SegTreeNode; typedef class SegTree{
public:
SegTreeNode* root;
SegTree():root(NULL){ }
SegTree(int size, int val){
build(root, , size, val);
}
SegTree(SegTreeNode* root):root(root){ } void build(SegTreeNode*& node, int from, int end, int val){
node = new SegTreeNode();
if(from == end){
node->s = (val == from) ? () : ();
return;
}
int mid = (from + end) >> ;
build(node->left, from, mid, val);
build(node->right, mid + , end, val);
node->pushUp();
}
}SegTree; typedef class Pair{
public:
int data;
int index;
Pair(const int data = , const int index = ):data(data), index(index){ }
boolean operator < (Pair another) const {
return data < another.data;
}
}Pair; typedef class ChairTree{ //主席树
public:
SegTree* st;
int* discrete;
map<int, int> to;
int len;
ChairTree():st(NULL), discrete(NULL){ }
ChairTree(int* lis, int len):len(len){
discrete = new int[(const int)(len + )];
memcpy(discrete, lis, sizeof(int) * (len + ));
sort(discrete + , discrete + len + );
for(int i = ; i <= len; i++)
to[discrete[i]] = i;
st = new SegTree[(const int)(len + )];
st[] = SegTree(len, );
for(int i = ; i <= len; i++){
st[i] = SegTree();
appendSegTree(st[i].root, st[i - ].root, , len, to[lis[i]]);
}
} void appendSegTree(SegTreeNode*& node, SegTreeNode*& before, int from, int end, int val){
node = new SegTreeNode();
if(from == end){
node->s = ;
return;
}
int mid = (from + end) >> ;
if(val <= mid){
node->right = before->right;
appendSegTree(node->left, before->left, from, mid, val);
}else{
node->left = before->left;
appendSegTree(node->right, before->right, mid + , end, val);
}
node->pushUp();
} int query(int l, int r, SegTreeNode*& left, SegTreeNode*& right, int k){
if(l == r){
return l;
}
int ls = left->left->s - right->left->s;
int mid = (l + r) >> ;
if(ls >= k) return query(l, mid, left->left, right->left, k);
return query(mid + , r, left->right, right->right, k - ls);
} int query(int from, int end, int k){
return discrete[query(, len, st[end].root, st[from - ].root, k)];
}
}ChairTree; int n, m;
ChairTree ct;
int *lis; inline void init(){
readInteger(n);
readInteger(m);
lis = new int[(const int)(n + )];
for(int i = ; i <= n; i++){
readInteger(lis[i]);
}
ct = ChairTree(lis, n);
} inline void solve(){
int l, r, k;
while(m--){
readInteger(l);
readInteger(r);
readInteger(k);
int res = ct.query(l, r, k);
printf("%d\n", res);
}
} int main(){
init();
solve();
return ;
}
Online Judge 2014 K-th Number -主席树的更多相关文章
- poj2104 k-th number 主席树入门讲解
poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树 刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...
- poj 2104 K-th Number 主席树+超级详细解释
poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)
题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...
- poj2104 K-th Number区间第k小值 主席树
原来主席树就是可持久化线段树啊,刚知道,,, 作为一道裸题,还是必A的,然而一开始偷懒不写离散化跪了N多遍,后来在缪大的帮助下发现了这个问题,遂A之 ——又是这种破问题,实在不想说自己了 把n个数看成 ...
- POJ2104 K-th Number[主席树]【学习笔记】
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 51440 Accepted: 17594 Ca ...
- [poj2104] K-th Number (主席树)
主席树 Description You are working for Macrohard company in data structures department. After failing y ...
- poj 2104 K-th Number(主席树 视频)
K-th Number 题意: 给你一些数,让你求一个区间内,第k大的数是多少. 题解: 主席树第一题,看的qsc视频写的,戳戳戳 学到了unique函数,他的作用是:把相邻的重复的放到后面,返回值是 ...
- 主席树:POJ2104 K-th Number (主席树模板题)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44952 Accepted: 14951 Ca ...
随机推荐
- HashMap 的工作原理及代码实现,什么时候用到红黑树
HashMap工作原理及什么时候用到的红黑树: 在jdk 1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即has ...
- vue.js个人学习心得
2017.4.7开始辞职刚好一个月时间,一个月时间里我开始彷徨,迷惘,失业带来的痛苦,打算转行,不再搞机械行业,因为不想再做低端的产品设计(本身不是研究生也不是说天资卓越,只是不甘于平凡). 好了,不 ...
- windows kibana的连接使用
下载后解压使用,打开config目录下的kibana.yml文件,然后添加:elasticsearch.url: "http://localhost:9200" 表示你要添加的e ...
- query:callback
function getName(callback) { setTimeout(function() { callback('Aaron') }, 1000) } //等待callback回调 get ...
- 006-jdk1.5版本新特性
一.Java SE 5.0 (1.5.0) 名称:Tiger(老虎) 发布日期:2004-09-30 新特性: 1.1.静态导入 定义:静态导入用于简化程序对类静态属性和方法的调用. 语法: impo ...
- 十天精通CSS3(11)
Media Queries——媒体类型(一) 随着科学技术不断的向前发展,网页的浏览终端越来越多样化,用户可以通过:宽屏电视.台式电脑.笔记本电脑.平板电脑和智能手机来访问你的网站.尽管你无法保证一个 ...
- spring boot集成shrio用于权限控制
下面是一个简单的springBoot集成shrio的项目,技术是:spring boot+idea+gradle+shrio+mybatis 1:首先在build.gradle中导入依赖 builds ...
- plsql的sql窗口中文模糊查询没有作用
环境变量新增: NLS_LANG = AMERICAN_AMERICA.AL32UTF8
- [LeetCode] 345. Reverse Vowels of a String_Easy tag:Two Pointers
Write a function that takes a string as input and reverse only the vowels of a string. Example 1: In ...
- [LeetCode] 383. Ransom Note_Easy tag: Hash Table
Given an arbitrary ransom note string and another string containing letters from all the magazines, ...