poj2104:K-th Number
思路:可持久化线段树,利用权值线段树,把建树过程看成插入,插入第i个元素就在第i-1棵树的基础上新建结点然后得到第i棵树,那么询问区间[l,r]就是第r棵树上的信息对应减去第l-1棵树上的信息,然后再利用权值线段树的职能找第k大,这里就巧妙地利用了可持久化线段树不修改原来线段树上的信息而是新建结点来更新信息,这样要询问某次操作下的线段树就访问那次操作新建的root就好了,而这里的区间[l,r]就被转换成了第l次操作到第r次操作,就用第r棵线段树上的信息对应减去第l-1棵线段树上的信息就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 100005 int n,q;
int a[maxn]; inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*f;
} struct node{
int val,id;
}v[maxn];
bool operator <(node a,node b){return a.val<b.val;}
bool cmp(node a,node b){return a.id<b.id;} struct functional_segment_tree{
int treedeg,root[maxn];
struct treenode{
int sum,ls,rs;
}tree[80*maxn];
void build(int &p,int l,int r){
if (!p) p=++treedeg;
if (l==r) return;
int mid=(l+r)>>1;
build(tree[p].ls,l,mid),build(tree[p].rs,mid+1,r);
}
void change(int &p,int k,int l,int r,int pos){
tree[p=++treedeg].ls=tree[k].ls,tree[p].rs=tree[k].rs,tree[p].sum=tree[k].sum+1;
if (l==r) return;
int mid=(l+r)>>1;
if (pos<=mid) change(tree[p].ls,tree[k].ls,l,mid,pos);
else change(tree[p].rs,tree[k].rs,mid+1,r,pos);
}
int query(int p,int k,int l,int r,int rank){
if (l==r) return l;
int mid=(l+r)>>1,sum=tree[tree[p].ls].sum-tree[tree[k].ls].sum;
if (rank<=sum) return query(tree[p].ls,tree[k].ls,l,mid,rank);
else return query(tree[p].rs,tree[k].rs,mid+1,r,rank-sum);
}
}T; int main(){
n=read(),q=read();
for (int i=1;i<=n;i++) a[i]=read(),v[i].val=a[i],v[i].id=i;
sort(v+1,v+n+1),sort(a+1,a+n+1);
for (int i=1;i<=n;i++) v[i].val=i;
sort(v+1,v+n+1,cmp);
T.build(T.root[0],1,n);
for (int i=1;i<=n;i++) T.change(T.root[i],T.root[i-1],1,n,v[i].val);
while (q--){
int l=read(),r=read(),k=read();
printf("%d\n",a[T.query(T.root[r],T.root[l-1],1,n,k)]);
}
return 0;
}
poj2104:K-th Number的更多相关文章
- lintcode 中等题:k Sum ii k数和 II
题目: k数和 II 给定n个不同的正整数,整数k(1<= k <= n)以及一个目标数字. 在这n个数里面找出K个数,使得这K个数的和等于目标数字,你需要找出所有满足要求的方案. 样例 ...
- R与数据分析旧笔记(十五) 基于有代表性的点的技术:K中心聚类法
基于有代表性的点的技术:K中心聚类法 基于有代表性的点的技术:K中心聚类法 算法步骤 随机选择k个点作为"中心点" 计算剩余的点到这个k中心点的距离,每个点被分配到最近的中心点组成 ...
- 动手写个数字输入框1:input[type=number]的遗憾
前言 最近在用Polymer封装纯数字的输入框,开发过程中发现不少坑,也有很多值得研究的地方.本系列打算分4篇来叙述这段可歌可泣的踩坑经历: <动手写个数字输入框1:input[type=nu ...
- xtrabackup备份MySQL报错:InnoDB: Error number 24 means 'Too many open files'
xtrabackup备份MySQL报错:InnoDB: Error number 24 means 'Too many open files' 1.使用xtrabackup备份MySQL时出现如下报错 ...
- 第193天:js---Math+Error+Number+Object总结
一.Math 随机选取 //随机选取 function getRandom (begin,end){ return Math.floor(Math.random()*(end-begin))+begi ...
- 统计学习方法三:K近邻
一.什么是K近邻? K近邻是一种基本的分类和回归方法. 在分类时,对新的实例,根据其K个最近邻的训练实例的类别,通过多数表决权等方式预测其类别. 通俗的讲,找K个和其关系最近的邻居,哪个类别的邻居多, ...
- 机器学习学习笔记之一:K最近邻算法(KNN)
算法 假定数据有M个特征,则这些数据相当于在M维空间内的点 \[X = \begin{pmatrix} x_{11} & x_{12} & ... & x_{1M} \\ x_ ...
- 【POI】导出xls文件报错:The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook
使用POI导出xls文件,由于数据过多,导致导出xls报错如下: The maximum number of cell styles was exceeded. You can define up t ...
- oracle创建jobs定时任务报错:PLS-00306: wrong number or types of arguments in call to 'JOB'
原脚本: begin sys.dbms_job.submit(job => job, what => 'xxx;', ...
- SPSS聚类分析:K均值聚类分析
SPSS聚类分析:K均值聚类分析 一.概念:(分析-分类-K均值聚类) 1.此过程使用可以处理大量个案的算法,根据选定的特征尝试对相对均一的个案组进行标识.不过,该算法要求您指定聚类的个数.如果知道, ...
随机推荐
- va_start、va_end、va_list的使用
1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...);void foo(parm_list,...); 2:函数参数的传递原理函数参数是以数据结构:栈的形式存 ...
- HDOJ-ACM1019(JAVA) 多个数的最小公倍数
题意:求多个数的最小公倍数 很简单,但是我一开始的做法,估计会让结果越界(超过int的最大值) import java.util.*; import java.io.*; public class M ...
- oracle创建表空间语句分解
1 create tablespace db_name 2 datafile 'D:\oracle\product\10.2.0\oradata\orcl\db_name_.dbf' size 200 ...
- 【转】sublime text 2 下的Markdown写作
sublime text 2 下的Markdown写作 作为Windows/Mac/Linux下强大的文本编辑器,st提供了对Markdown语言的支持.通过设置可实现markdown预览和转换功 ...
- windows下svn+apache搭建svn服务器
使用软件: apache_2.0.55-win32-x86-no_ssl.msi Setup-Subversion-1.5.3.msi TortoiseSVN-1.5.10.16879-win32-s ...
- iOS开发 落地消息多的处理办法(仅供参考)
1.首先要知道一点,你的消息储存是用数据库储存的! 看了一下微信和qq的消息处理,一般情况下第三方(亲加,容云,环信都会有本地的数据库)处理过的! 但是我发现,最近一个需求要求开发@"消息已 ...
- Chapter 1 Securing Your Server and Network(6):为SQL Server訪问配置防火墙
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38082123,专题文件夹:http://blog.csdn.net/dba_huangz ...
- MySQL对于datetime 源码分析
http://tsecer.blog.163.com/blog/static/150181720160117355684/ 一.时间比较的语法分析 在mysql中,通常时间是一个必不可少的类型,而 ...
- WSGI是一种编程接口,而uwsgi是一种传输协议
http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html http://sunxiunan.com/?p=1778 cgi---------fastc ...
- Ubuntu14.04服务器安装ftp
随笔记录一下Ubuntu下安装ftp 1.远程连接登录服务器之后,输入sudo apt-get update 并回车.如果不运行该命令,直接安装vsftpd,可能会出现有一些软件包无法下载. 2.输入 ...