C++之路进阶——(可持续化线段树)
2016-01-20 10:01
330 查看
K-th Number
Description
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.
Input
The 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 109 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).
Output
For each question output the answer to it --- the k-th number in sorted a[i...j] segment.
Sample Input
Sample Output
Hint
This problem has huge input,so please use c-style input(scanf,printf),or you may got time limit exceed.
Source
题目大意:给你一段序列,求给定区间[u,v]中第k小的值
代码:
Time Limit: 20000MS | Memory Limit: 65536K | |
Total Submissions: 44537 | Accepted: 14781 | |
Case Time Limit: 2000MS |
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.
Input
The 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 109 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).
Output
For 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.
Source
题目大意:给你一段序列,求给定区间[u,v]中第k小的值
代码:
#include<cstdio> #include<iostream> #include<algorithm> #define maxn 1000100 using namespace std; int n,m,sz; int hash[maxn],a[maxn],root[maxn],ls[maxn*80],rs[maxn*80],sum[maxn*80]; void updata(int l,int r,int x,int &y,int v) { y=++sz; sum[y]=sum[x]+1; if (l==r) return; ls[y]=ls[x]; rs[y]=rs[x]; int mid=(l+r)>>1; if (v<=mid) updata(l,mid,ls[x],ls[y],v); else updata(mid+1,r,rs[x],rs[y],v); } int que(int L,int R,int K) { int l=1,r=n,mid,x,y; x=root[L-1]; y=root[R]; while (l!=r) { mid=(l+r)>>1; if (K<=sum[ls[y]]-sum[ls[x]]) { x=ls[x]; y=ls[y]; r=mid; } else { K-=(sum[ls[y]]-sum[ls[x]]); x=rs[x]; y=rs[y]; l=mid+1; } } return l; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i]),hash[i]=a[i]; sort(hash+1,hash+n+1); for (int i=1;i<=n;i++) { int w=lower_bound(hash+1,hash+n+1,a[i])-hash; updata(1,n,root[i-1],root[i],w); } for (int i=1;i<=m;i++) { int l,r,v; scanf("%d%d%d",&l,&r,&v); printf("%d\n",hash[que(l,r,v)]); } return 0; }
相关文章推荐
- 关于 C++ 框架、库和资源的一些汇总列表
- C++模板(二)
- C语言冒泡排序法心得
- VC++ 中使用内存映射文件处理大文件
- c++模板(一)
- Qt & C++变量类型装换
- 论“使用C++非内置全局变量的风险”
- 解决VTune错误.../lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ...)
- thiscall仅仅应用于“C++”成员函数(this指针存放于CX寄存器,参数从右到左压)
- C++编译时函数名修饰约定规则(很具体),MFC提供的宏,extern "C"的作用
- C++中如何用cout实现输出的填充,宽度,对齐及其精度控制
- C++ 自定义日期类实现日期的加减算法
- C++ 实现mystring类型
- 有序数组的合并 c++模板实现
- 优化快速排序 C语言代码
- C++模板数组实现有序数组的排列合并算法
- 看朱老师视频笔记-------C语言
- 【C语言】C语言字符串函数实现(一)
- C++ string大小写转换以及transform,tolower,toupper,用法
- C++中引用概念