了解了。。。。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
typedef long long LL;
const int MAXN = 100999;//点数的最大值
const int MAXM = 1000010;//边数的最大值
const LL INF = 1152921504;
/*
* 划分树(查询区间第k小)
*/
int tree[20][MAXN];//表示每层每个位置的值
int sorted[MAXN];//已经排序好的数
int toleft[20][MAXN];//toleft[p][i]表示第p层从1到i有数分入左边
void build(int l,int r,int dep)
{if(l == r)return;int mid = (l+r)>>1;int same = mid - l + 1;//表示等于中间值而且被分入左边的个数for(int i = l; i <= r; i++) //注意是l,不是oneif(tree[dep][i] < sorted[mid])same--;int lpos = l;int rpos = mid+1;for(int i = l; i <= r; i++){if(tree[dep][i] < sorted[mid])tree[dep+1][lpos++] = tree[dep][i];else if(tree[dep][i] == sorted[mid] && same > 0){tree[dep+1][lpos++] = tree[dep][i];same--;}elsetree[dep+1][rpos++] = tree[dep][i];toleft[dep][i] = toleft[dep][l-1] + lpos - l;}build(l,mid,dep+1);build(mid+1,r,dep+1);
}
//查询区间第k小的数,[L,R]是大区间,[l,r]是要查询的小区间
int query(int L,int R,int l,int r,int dep,int k)
{if(l == r)return tree[dep][l];int mid = (L+R)>>1;int cnt = toleft[dep][r] - toleft[dep][l-1];//区间内有多少个被分到左区间if(cnt >= k)//左儿子里的树>=k,在左边找{int newl = L + toleft[dep][l-1] - toleft[dep][L-1];//改变区间,使得新区间包含l ,r 里面的数int newr = newl + cnt - 1;return query(L,mid,newl,newr,dep+1,k);}else{int newr = r + toleft[dep][R] - toleft[dep][r];//右边有(toleft[dep][R] - toleft[dep][r])个在左区间,可以向右移动这么多int newl = newr - (r-l-cnt);return query(mid+1,R,newl,newr,dep+1,k-cnt);}
}
int main()
{int n,m;// freopen("in.txt","r",stdin);while(scanf("%d%d",&n,&m)!=EOF){memset(tree,0,sizeof(tree));for(int i = 1; i <= n; i++){scanf("%d",&tree[0][i]);sorted[i] = tree[0][i];}sort(sorted+1,sorted+n+1);build(1,n,0);while(m--){int l,r,k;scanf("%d%d%d",&l,&r,&k);printf("%d\n",query(1,n,l,r,0,k));}}return 0;}

转载于:https://www.cnblogs.com/kewowlo/p/4002574.html

【划分树】 POJ 2104 HDU 2665 K-th Number 裸题相关推荐

  1. 【划分树+二分】HDU 4417 Super Mario

    第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

  2. hdu 5062 Beautiful Palindrome Number(水题)

    题目链接:hdu 5062 Beautiful Palindrome Number 题目大意:略. 解题思路:暴力或者手算都可以,注意手算的话,分别算出1,2,3...位的情况后,答案是累加上去的. ...

  3. 【HDU - 2665】Kth number(区间第K大,主席树,模板)

    题干: Give you a sequence and ask you the kth big number of a inteval. Input The first line is the num ...

  4. HDU 4417 Super Mario(划分树问题求不大于k的数有多少)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  5. POJ 2104 划分树

    划分树:查询区间第K大 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #includ ...

  6. [数据结构-划分树小结]

    划分树是一种基于线段树的数据结构.主要用于快速求出(在log(n)的时间复杂度内)序列区间的第k大值. 先看下图已经建好的划分树是什么样子的,原始数组是[1,5,2,3,6,4,7,3,0,0],并把 ...

  7. POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)

    题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...

  8. hdu 2665 Kth number(划分树模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ]  改变一下输入就可以过 http://poj.org/problem? ...

  9. 划分树基础 —— HDU 2665 Kth number

    对应 HDU 题目 :点击打开链接 Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

最新文章

  1. mysql5.7系列修改root默认密码
  2. 深入Windows原理杂记
  3. Windows上使用bat实现备份一个月内的数据库数据到文件
  4. Linux有待完善的小缺陷的累记
  5. Dapr + .NET Core实战(三)状态管理
  6. LeetCode2:Add Two Numbers
  7. php连接mysql遇到的问题: (HY000/1130) 和 [caching_sha2_password]
  8. 软件测试——测试用例设计方法
  9. PASCAL VOC2012数据集的下载及简单讲解
  10. Springboot项目中添加Quartz定时任务
  11. 【C/C++】STL详解
  12. zookeeper的羊群效应
  13. 帮谷歌推广Webp图片格式之:Webp的格式转换
  14. 豆瓣评分9.4!跟邱锡鹏教授一起学「神经网络与深度学习」,7月19日开课
  15. OJ刷题记录:将十进制数转换成八进制数 题目编号:545
  16. PDF工具箱-分割提取合并
  17. python调用阿里云sdk入门(hello world)
  18. 机器学习--基础算法--机器学习基础
  19. c++图像处理入门教程
  20. 犬夜叉手游觉醒服务器维护,《犬夜叉-觉醒》最详细最容易入门新手指导

热门文章

  1. 常见排序算法及其java实现
  2. 【语言处理与Python】1.4回到Python:决策与控制
  3. jsp中有关于超链接的问题
  4. mysql UNIX时间戳与日期的相互转换
  5. Visual Studio 2010Beta与Silverlight的更新
  6. 新设备关联Gitlab
  7. 软件相关模块与ansible剧本
  8. C#的四种Timer介绍
  9. redis伪集群安装linux,redis伪集群搭建(亲测无坑)
  10. 【音频处理】Melodyne 选择工具使用 ( 主工具简介 | 修改音高 | 自动吸附 | 音符长度修改 | 长度自动吸附 | 设置音符分离线 | 设置片段分离线 )