题目链接:http://poj.org/problem?id=2104

题目大意:给定还有n个数的序列,m个操作,每个操作含有l,r,k,求区间[l,r]第k大

解题思路:线段树只能维护序列的最大值最小值,考虑对于输入的序列的每一个前缀建立一颗线段树,即含有n颗线段树,这样肯定会爆内存。相邻两颗线段树其实有很多相同的,不同的大概就是 log n个节点,我们新开log n个节点就可以了。每个节点存的sum值为当前节点数字出现的次数,对于区间[l,r],我们可以用第r颗线段树减去第l-1颗线段树得到的便是[l,r]区间在每个节点出现的次数,先从它的左子树开始查找判断左子树节点个数sum是否大于等于k,如果大于等于k从左子树找第k大,否则从右子树查找第k-sum大。

代码:

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
const int maxn=1e5+;
int n,m,cnt,root[maxn],a[maxn],x,y,k;
struct node{
int l,r,sum;
}T[maxn*];
vector<int> v;
int getid(int x){
return lower_bound(v.begin(),v.end(),x)-v.begin()+;
}
void update(int l,int r,int &x,int y,int pos){
T[++cnt]=T[y],T[cnt].sum++
,x=cnt;
if(l==r) return;
int mid=l+r>>;
if(mid>=pos) update(l,mid,T[x].l,T[y].l,pos);
else update(mid+,r,T[x].r,T[y].r,pos);
}
int query(int l,int r,int x,int y,int k){
if(l==r) return l;
int mid=l+r>>;
int sum=T[T[y].l].sum-T[T[x].l].sum;
if(sum>=k) return query(l,mid,T[x].l,T[y].l,k);
else return query(mid+,r,T[x].r,T[y].r,k-sum);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]),v.push_back(a[i]);
sort(v.begin(),v.end()),v.erase(unique(v.begin(),v.end()),v.end());
for(int i=;i<=n;i++) update(,n,root[i],root[i-],getid(a[i]));
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&k);
printf("%d\n",v[query(,n,root[x-],root[y],k)-]);
}
return ;
}

最新文章

  1. EM算法总结
  2. easyui datagrid 编辑模式详解
  3. css+js定位到屏幕中间
  4. Android项目实战(十六):QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件
  5. Cocos2d-x解析XML文件,解决中文乱码
  6. WOW: 宏
  7. 关于RotateAnimation的各构造方法的参数
  8. 嵌入式开发应该掌握的一些Linux命令
  9. jQuery AJAX load() 方法
  10. Android中用Application类实现全局变量
  11. 14.2.5.4 Physical Structure of an InnoDB Index InnoDB Index 的物理结构
  12. U3D简单得换装技术
  13. 【Android Developers Training】 52. 打印照片
  14. Deep Learning Enables You to Hide Screen when Your Boss is Approaching
  15. avpicture_fill的实现
  16. mongodb管理与安全认证
  17. Spark基础脚本入门实践2:基础开发
  18. “一键制作启动u盘失败”的主要原因是什么?
  19. centos添加epel源
  20. [Python]网络爬虫(五):urllib2的使用细节与抓站技巧(转)

热门文章

  1. jquery 获取 input type radio checked的元素
  2. [转]Linux下防止进程使用swap及防止OOM机制导致进程被kill掉
  3. jvm监测
  4. 标签button:点击button按钮时,出现了页面自动刷新的情况
  5. 最新版本的MySQL的下载和安装(Release: 8.0.12)
  6. weight(搜索对象的选取)
  7. openocd安装与调试
  8. KindEditor上传图片一直提示undefined
  9. 去掉IE浏览器里的脚本控件提示
  10. 32 kill不掉的语句