【POJ2104】kth num

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.

题目大意

求区间[l,r]中第k小的值

主席树裸题,我现在也只能做裸题

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstdlib>
 4 using namespace std;
 5 const int N=1000;
 6 int a[N],b[N],ls[N],rs[N],sum[N],root[N];
 7 int t,sz,n,m;
 8 void build(int l,int r,int x,int &y,int v){
 9     y=++sz;
10     ls[y]=ls[x]; rs[y]=rs[x];
11     sum[y]=sum[x]+1;
12     if (l==r) return;
13     int mid=(l+r)>>1;
14     if (v>mid) build(mid+1,r,rs[x],rs[y],v);
15     else build(l,mid,ls[x],ls[y],v);
16 }
17
18 int query(int L,int R,int w){
19     int l=1,r=t,mid=(l+r)>>1;
20     int x=root[L-1],y=root[R];
21     while (l!=r){
22         if (sum[ls[y]]-sum[ls[x]]>=w){r=mid;x=ls[x];y=ls[y];mid=(l+r)>>1;}
23         else {w-=sum[ls[y]];w+=sum[ls[x]];l=mid+1;x=rs[x];y=rs[y];mid=(l+r)>>1;}
24     }
25     return l;
26 }
27
28 int main(){
29     scanf("%d%d",&n,&m);
30     for (int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}
31     sort(b+1,b+n+1);
32     t=unique(b+1,b+n+1)-b-1;
33     for (int i=1;i<=n;i++){
34         int w=lower_bound(b+1,b+t+1,a[i])-b;
35         build(1,t,root[i-1],root[i],w);
36     }
37     int l,r,w;
38     for (int i=1;i<=m;i++){
39         scanf("%d%d%d",&l,&r,&w);
40         printf("%d\n",b[query(l,r,w)]);
41     }
42 }
时间: 2024-12-13 19:32:22

【POJ2104】kth num的相关文章

【poj2104】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 segmen

【POJ2104】K-th Number——主席树

早上刷NOIP的题刷到有点烦就想学点新东西,然后.....一个早上就这样过去了QAQ.虽然主席树不是NOIP考点,但是...或许我能活到省选呢?(美好的幻想) 题目链接 题目的大意就是给定一个长度为n的区间,给出m个询问,每次询问一个区间[l,r]中第k小的树. 主席树(一种可持久化线段树)的入门题. 推荐一发学习资料:戳这里 感觉人家讲得很仔细了我也没什么讲的必要了...... 总算是学了一种可持久化树了,好像也没想象中那么难?这道题的重点在query函数方面,建议自己在纸上模拟一下建树和查询

【POJ2104】K-th Number 主席树?函数式线段树?可持久化线段树?……反正是其中一个

题意:区间静态第K大. 题解: 可持久化线段树. 可持久化线段树: 基本思想:我们维护插入每个节点后的线段树. 朴素写法(MLE+TLE)我们对于每次插入,都复制一棵线段树而后插入,这样保证了"可持久化". 但是显然,时间复杂度和空间复杂度都是n^2的.233. 所以有了优化写法:我们发现每次的插入只有logn个节点被改变,所以只需要这些点新建,其它点都指向原来版本的节点就好了. 空间复杂度nlogn. 然后这道题是区间第K大,对于区间[a,b],插入到b时的线段树,节点的size-(

【POJ2104】【整体二分+树状数组】区间第k大

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

【leetcode】Kth Largest Element in an Array (middle)☆

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example,Given [3,2,1,5,6,4] and k = 2, return 5. 思路: 堆.讲解:二叉堆 class Solution { public: //新插入i结点 其父节点为(i

【bzoj2104】 K-th Number

http://poj.org/problem?id=2104 (题目链接) 题意:求区间第k大数. Solution1  主席树裸题.  主席树当时我学是学的要死,那个时候不晓得百度出什么bug了,搜个主席树出来的全是什么习主席巴拉巴拉的东西...于是找了个模板问同学自己磨出来的.  有个博客我觉得写得还不错:想学主席树戳这里  另外,这里的主席树储存的是值域,而不是别的. 代码: // poj2104 #include<algorithm> #include<iostream>

【LeetCode】two num 利用comparable接口 对对象进行排序

题目two num 题意:给定一个整数数组和一个目标值,要求在数组中找到两个数,使得它们的和相加等于目标值,并且返回两个数的下标 思路:1.如果使用暴力,时间复杂度为O(n^2) 2.可以先将所有数进行排序,从最大值和最小值开始匹配再根据和目标值的比较移动,知道找到结果,时间复杂度为O(nlog(n)) 知识点:comparable 接口的使用,利用其进行对象的自然排序,相关文章 public class Solution { static class Node implements Compa

【Leetcode】Kth Smallest Element in a Sorted Matrix

题目链接:https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/ 题目: Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix. Note that it is the kth smallest eleme

【树】Kth Smallest Element in a BST(递归)

题目: Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note: You may assume k is always valid, 1 ≤ k ≤ BST's total elements. 思路: 1.计算左子树元素个数leftSize. 2. leftSize+1 = K,则根节点即为第K个元素 leftSize >=k, 则第K个元素在左子树