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.此过程使用可以处理大量个案的算法,根据选定的特征尝试对相对均一的个案组进行标识.不过,该算法要求您指定聚类的个数.如果知道, ...
随机推荐
- Codeforces Round #226 (Div. 2)C. Bear and Prime Numbers
/* 可以在筛选质数的同时,算出每组数据中能被各个质数整除的个数, 然后算出[0,s]的个数 [l,r] 的个数即为[0,r]的个数减去[0,l]个数. */ #include <stdio.h ...
- 使用WIF实现单点登录Part II —— Windows Identity Foundation基本原理 -摘自网络
在上一篇文章中,我们已经使用WIF构建了一个基于MVC4的简单的身份验证程序,在这篇文章里,我们将探讨一下到底什么是WIF,以及它的工作原理.然后在下一篇文章开始,我们将实际操作,实现单点登录功能. ...
- 版本控制Subversion TortoiseSVN apache VisualSVN笔记(转载)
转载于http://blog.sina.com.cn/s/blog_6b94d5680101m7ah.html Subversion(简称svn)是近年来崛起的版本管理软件,是cvs的接班人.目前,绝 ...
- 一步一步学android控件(之十六)—— CheckBox
根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...
- 【转载】ShowWindow函数
ShowWindow的API函数是显示窗体,但它在第一次调用和以后的调用是有差别的.第一次调用时,它的输入參数nCmdShow是须要输入WinMain函数里传入来的nCmdShow參数,而不能是其他參 ...
- Android AsyncTask运作原理和源码分析
自10年大量看源码后,很少看了,抽时间把最新的源码看看! public abstract class AsyncTask<Params, Progress, Result> { p ...
- Android开发_Gson解析
//转换器 GsonBuilder builder = new GsonBuilder(); // 不转换没有 @Expose 注解的字段 builder.excludeFieldsWithoutEx ...
- oracle表锁住 解锁办法
第一种方法: 用系统账户如sys as SYSDBA 登录进去 1.查看数据库锁,诊断锁的来源及类型: select object_id,session_id,locked_mode f ...
- 一个苹果证书怎么多次使用(授权Mac开发)——导出p12文件
为什么要导出.p12文件 当我们用大于三个mac设备开发应用时,想要申请新的证书,如果在我们的证书里,包含了3个发布证书,2个开发证书,可以发现再也申请不了开发证书和发布证书了(一般在我们的证书界面中 ...
- youku的js脚本的工具函数和初始化方法
定义日志输出函数 (function(){ if(window['console']){ return; } window['console'] = { log: function(){} ,clea ...