PKU-2104-K-th Number
| Time Limit: 20000MS | Memory Limit: 65536K | |
| Total Submissions: 36045 | Accepted: 11522 | |
| Case Time Limit: 2000MS | ||
Description
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 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
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
Source
field=source&key=Northeastern+Europe+2004">Northeastern Europe 2004
, Northern Subregion这道题貌似有非常多种解法
我是用归并树做的
所谓归并树就是将 归并排序过程组成一个树
树上的每一个节点就是非递减的。
以1 5 2 6 3 7为例:
把归并排序递归过程记录下来即是一棵归并树:
[1 2 3 5 6 7]
[1 2 5] [3 6 7]
[1 5] [2] [3 6] [7]
[1][5] [6][3]
用相应的下标区间建线段树:(这里下标区间相应的是原数列)
[1 6]
[1 3] [4 6]
[1 2] [3] [4 5][6]
[1][2] [4][5]
做法就是在归并树的根节点二分查找答案,然后用线段树查询rank值,由于线段树的每一个节点与归并树的节点是一一相应的,而归并树的的节点元素是非递减的,因此能够用二分算出rank值。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 100000+10; struct node{
int lson,rson;
int mid(){
return (lson+rson)>>1;
}
}tree[maxn*4]; int seg[25][maxn];
int n,m;
int num[maxn];
int sta,ed; void build(int L,int R,int rt,int deep){
tree[rt].lson = L;
tree[rt].rson = R;
if(L==R){
seg[deep][L] = num[L];
return;
}
int mid = tree[rt].mid();
build(L,mid,rt<<1,deep+1);
build(mid+1,R,rt<<1|1,deep+1);
int i = L,j = mid+1,k = L;
while(i <= mid && j <= R){
if(seg[deep+1][i] < seg[deep+1][j]){
seg[deep][k] = seg[deep+1][i];
i++;
}else{
seg[deep][k] = seg[deep+1][j];
j++;
}
k++;
}
while(i <= mid){
seg[deep][k] = seg[deep+1][i];
i++;
k++;
}
while(j <= R){
seg[deep][k] = seg[deep+1][j];
j++;
k++;
}
return;
} int query(int rt,int dep,int key){
if(tree[rt].lson >= sta && tree[rt].rson <= ed){
int t = lower_bound(&seg[dep][tree[rt].lson],&seg[dep][tree[rt].rson]+1,key)-&seg[dep][tree[rt].lson];
return t;
}
int mid = tree[rt].mid();
int res = 0;
if(mid >= sta){
res += query(rt<<1,dep+1,key);
}
if(mid < ed){
res += query(rt<<1|1,dep+1,key);
}
return res;
} int binary(int tk){
int L = 1,R = n;
while(L <= R){
int mid = (L+R) >> 1;
if(query(1,0,seg[0][mid]) > tk){
R = mid-1;
}else{
L = mid+1;
}
}
if(query(1,0,seg[0][R])==tk){
return seg[0][R];
}else{
return seg[0][L];
}
} int main(){ cin >> n >> m;
for(int i = 1; i <= n; i++){
scanf("%d",&num[i]);
}
build(1,n,1,0);
while(m--){
int k;
scanf("%d%d%d",&sta,&ed,&k);
printf("%d\n",binary(k-1));
}
return 0;
}
PKU-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(整体二分)
http://poj.org/problem?id=2104 题意:给出n个数和m个询问求区间第K小. 思路:以前用主席树做过,这次学整体二分来做.整体二分在yr大佬的指点下,终于大概懂了点了.对于二 ...
- 【POJ 2104】 K-th Number 主席树模板题
达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number
A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...
- [POJ2104] K – th Number (可持久化线段树 主席树)
题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...
- POJ 2104:K-th Number 整体二分
感觉整体二分是个很有趣的东西. 在别人的博客上看到一句话 对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了 树套树写了一天还是WA着,调得焦头烂额,所以决定学cd ...
- ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)
https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...
- Count the number of possible triangles
From: http://www.geeksforgeeks.org/find-number-of-triangles-possible/ Given an unsorted array of pos ...
- 大数据热点问题TOP K
1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...
- Codeforces Round #350 (Div. 2) F. Restore a Number 模拟构造题
F. Restore a Number Vasya decided to pass a very large integer n to Kate. First, he wrote that num ...
随机推荐
- 使用 IntraWeb (1) - 先测试如何部署为 Asp.Net 的应用
IntraWeb 14 可以部署为 Asp.Net 的应用程序, 需要 NET Framework 4.5 和 ASP.NET MVC 4 或之上版本的支持; 这下, 只能用虚拟主机的朋友有福了! 我 ...
- 阿里云VPC默认网关问题
在使用VPC专用网络时,阿里云上面不用设置网关都可以工作,其实不是的,狗日的阿里云居然把默认网关设置成了253,比如设置了172.18.0.0/24时,那么它的默认网关就是172.18.0.253.
- VIM简单配置(windows)
set number set history=1000000 set tabstop=4 set shiftwidth=4 set smarttab set nocp filetype plugin ...
- delphi SPCOMM的一些用法注意
使用串口SPCOMM接收数据的时候0x11和0x13无法接受,从时间间隔上看来可以接收,但是无法显示.网上查错误得: --------------------------------------- ...
- [Asp.net mvc]国际化
摘要 在实际项目中,经常遇到,开发的项目要提供给不同的国家使用,如果根据国家来开发不同的站点,肯定是非常耗时又耗成本的.asp.net中,提供了一种比较方便的方式,可以使用资源文件的方式,使我们的站点 ...
- 安装/使用 MVVMLight(转)
安装 MVVMLight Toolkit 为什么说是 MVVMLight Toolkit ?实际上我们一般安装的都是 MVVMLight Toolkit ,这个里面包含了工具就是在VS新建工程的时候你 ...
- url提交参数类
url提交参数类 type /// <summary> /// 准备url /// </summary> TynUrl = class private FUrl, FComma ...
- 在NDK C++线程中如何调用JAVA API
from://http://www.eoeandroid.com/thread-150995-1-1.html 在NDK中创建的线程中, 只允许调用静态的Java API. 当在线程中调用env-&g ...
- cocos2d-x 3.0 正式版 项目创建
官方示比例如以下: Example: $ cd cocos2d-x $ ./setup.py $ source FILE_TO_SAVE_SYSTEM_VARIABLE $ cocos new Eng ...
- Java Swing 使用非本地字体
package reyo; import java.awt.Container; import java.awt.Font; import java.awt.FontFormatException; ...