poj 2104 划分树(查询区间第k大数)

ICT调试技巧:从基础到实战的全面指南 本文提供了一份全面的ICT调试技巧指南,涵盖从基础认知到实战应用的全过程。详细解析了ICT设备硬件结构、程序文件构成,并重点讲解了调试界面的核心参数与高效快捷键。通过跳线、电阻、电容及二极管等常见元器件的实战调试案例,分享了参数设置要点与典型问题解决方案,帮助工程师快速掌握ICT调试核心技能,提升测试效率与准确性。 阅读详情

题意:给定一个n个数的数组,有m个查询,每个查询为[a,b,k],意思是区间[a,b]的第k大数。

思路:由这个题认识了什么叫做划分树。划分树的基本思想就是对于某个区间,把它划分成两个子区间,左边区间的数小于右边区间的数。查找的时候通过记录进入左子树的数的个数,确定下一个查找区间,最后范围缩小到1,就找到了。

建树的过程比较简单,对于区间[l,r],首先通过对原数组的排序找到这个区间的中位数a[mid],小于a[mid]的数划入他的左子树[l,mid-1],大于它的划入右子树[mid,r]。同时,对于第i个数,记录在[l,i]区间内有多少数被划入左子树。最后,对它的左子树区间[l,mid-1]和右子树区间[mid,r]递归的继续建树就可以了。
建树的时候要注意对于被分到同一子树的元素,元素间的相对位置不能改变。

查找的过程:查找深度为h,在大区间[L,R]中找小区间[left,right]中的第k元素。再看看他是如何工作的。我们的想法是,先判断[left,right]中第k元素在[L,R]的哪个子树中,然后找出对应的小区间和k,递归的进行查找,直到小区间的left = right为止。具体思路见代码中注释。

注意:num数组除了这种建立方法还可以在建树时以每个区间为单位建立(百度百科的方法),

if( i==l )
num[c][i]=0;
else
num[c][i]=num[c][i-1];

这样建树在查询的时候代码能少写一些。

#include <cstdio>
#include <algorithm>
#define N 100005
using namespace std;
int s[N],t[25][N],num[25][N];
int n,m;
void build(int left,int right,int d){
    int i,j,k,mid,ml,flag;
    if(left == right)
        return;
    mid = (left+right)>>1;
    ml = mid-left+1;
    for(i = left;i<=right;i++)//注意是从left到right而不是到mid
        if(t[d][i] < s[mid])
            ml--;
    j = left,k = mid+1;
    for(i = left;i<=right;i++){
        flag = 0;
        if(t[d][i] < s[mid] || (t[d][i]==s[mid]&&ml)){//表示进入左子树
            flag = 1;
            if(t[d][i] == s[mid])//如果是和中位数相等的情况
                ml--;
            t[d+1][j++] = t[d][i];
        }else
            t[d+1][k++] = t[d][i];
        num[d][i] = num[d][i-1]+flag;//记录进入左子树的个数
    }
    build(left, mid, d+1);
    build(mid+1, right, d+1);
}
int query(int left,int right,int k,int L,int R,int d){
    int mid,x,y,rx,ry,val;
    if(left == right)
        return t[d][left];
    mid = (L+R)>>1;
    x = num[d][left-1] - num[d][L-1];//[L,left)内去往左子树的个数
    y = num[d][right] - num[d][L-1];//[L,right]内去往左子树的个数
    val = y-x;//[left,right]内去往左子树的个数
    rx = left - L - x;//[L,left)内去往右子树的个数
    ry = right - L + 1 - y;//[L,right]内去往右子树的个数
    if(k <= val)
        return query(L+x, L+y-1, k, L, mid, d+1);
    return query(mid+1+rx, mid+ry, k-val, mid+1, R, d+1);
}
int main(){
    int i,j,k,x;
    scanf("%d %d",&n,&m);
    for(i = 1;i<=n;i++){
        scanf("%d",&s[i]);
        t[0][i] = s[i];
    }
    sort(s+1,s+1+n);
    build(1,n,0);
    for(i = 0;i<m;i++){
        scanf("%d %d %d",&j,&k,&x);
        printf("%d\n",query(j,k,x,1,n,0));
    }
}
/*
t数组值如下,四周序号表示下标
t 1 2 3 4 5 6 7
0 1 5 2 6 3 7 4
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
3 1 2 3 4 5 6 0
 
num数组值如下,四周序号表示下标
num 1 2 3 4 5 6 7
  0 1 1 2 2 3 3 4
  1 1 2 2 2 3 4 4
  2 1 1 2 2 3 3 0
*/


上机任务一:空气质量指数 (air quality index,AQI是定量描述空气质量状况的指数。为了更好地了解和人们身体健康息息相关的天气状况,本书模拟生成500条某地区天气数据,一行样本对应一天 调整后的R平方为0.4308,考虑了模型中的自由度,它略低于多重R平方,说明模型的解释能力可能有限。总的来说,新的模型相对于之前的模型在AIC值上更优,包含了最高温度(X2)和最低温度(X3)这两个重要的预测因子,并且对AQI的解释能力较好。在表中,Df表示自由度,Sum Sq表示总平方和,Mean Sq表示均方(总平方和除以自由度),F value表示F统计量,Pr(>F)表示对应的p值。在分析这些结果时,需要关注系数的显著性(p值),系数的方向(正向或负向影响),以及系数的大小(估计值)。 阅读详情

相关推荐

RoboMaster机甲大师赛备赛:如何用STM32+CAN总线精准控制四个大疆3508电机?

本文详细介绍了在RoboMaster机甲大师赛中,如何利用STM32和CAN总线技术精准控制四台大疆3508电机。从硬件架构设计、多电机ID分配、数据解析到同步控制算法,全面解析了构建高响应、低延迟底盘驱动系统的关键技术,助力参赛队伍提升机器人运动性能。

weixin_28684825的博客 134

poj 2104 归并树

每次查找二分出某个数,logn时间在树中找到它的区间,二分找比它小的数的个数,三次二分= (log n)^3 解决的问题:查询某个区间内第k大的数 值得注意的是: 1.归并树,划分树都只能解决元素不重复的情况 2.多个x有相同rank的时候取最大的x 这些相同rank的数组成一个序列A1,A2,……An,之间两两不同,因为没有重复元素 若答案不是An而是Ai(1

Jackyguo1992的专栏 1029

百度智能云ASR实战:5分钟搞定Unity语音转文字(含完整代码)

本文详细介绍了如何在Unity中集成百度智能云ASR服务,实现高效的语音转文字功能。从环境配置、音频处理到服务端通信,提供完整代码示例和实战优化技巧,帮助开发者快速实现语音交互功能,适用于游戏开发、XR应用等场景。

ujm56789012的博客 215

hdu 5412 CRB and Queries(动态区间第k大值,区间能修改)(整体二分,树状数组套平衡树,线段树套treap)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5412 解题思路: 官方题解: In this problem, we can use BIT and Treap. We use BIT for coding skill and each element of BIT is Treap. First, for eac

piaocoder 2518

保姆级教程:彻底清理Win11更新缓存并解除外设,一次搞定0xc1900101更新错误

本文提供了一套完整的Win11更新报错0xc1900101解决方案,涵盖软件环境净化和硬件设备隔离。通过终止干扰进程、重置更新组件、清理临时文件以及断开外设等步骤,有效提升更新成功率。特别强调外设驱动兼容性对解决0xc1900101错误的关键作用。

weixin_33483304的博客 419

高效打卡系统设计:从行为心理学到实践工具

打卡系统作为现代时间管理的重要工具,其核心原理植根于行为心理学中的即时反馈机制和习惯养成理论。通过科学设计的打卡周期和可视化反馈,能有效提升个人自律性和目标达成率。在技术实现上,从纸质记录到数字化工具(如Notion、Excel自动化模板)的演进,为不同场景提供了灵活解决方案。特别在习惯追踪和进度管理领域,结合热力图生成、数据统计等技巧,打卡系统能转化为强大的自我监督工具。本文通过实践案例,详解如何构建兼顾弹性和约束力的个性化打卡方案,帮助读者突破'三天打鱼两天晒网'的常见困境。

weixin_30047059的博客 338

POJ2104(平方分割)

解题思路:以前使用主席树AC过一次的题目,现在用平方分割来试试。大致做法就是,把所有数放进MAXN大小的桶中。然后对各个桶中的数进行排序。处理时采用二分搜索的办法确定结果。即如果有1.。。n个数。则用二分来试这个数试mid是区间中第几小的数。关于平方分割处理的细节就是:把不完全包括在桶中部分用枚举的办法筛选,对于完全包括在区间内的桶,则用二分搜索。最后的复杂度为O(m*(logn)*(根号n*lo...

qq_39861441的博客 393

MOS管热阻的测量方法

实验室内如何测试mos管热阻

weixin_43492562的博客 4092

poj2104 主席树

题目大意:给一串数字,多次询问区间的第k小值 思路:不带修改的主席树。第一次打主席树,所以还是参照了以下网上的模板。主席树的原理: 其实就是每添加一个数,就增加一棵树(其实是一条链),然后这条链上的计数值都+1,表示这个树链比之前的要多加了一个数。这样,想要比较第i个数与第j个数区间内,第k大的数就很好求了。只要比较s[i-1]和s[j]即可(即第i-1条树链,第j条树链),因为这两条树链的区...

qq_39861441的博客 242

C#图像处理:OpenCVSharp实现简单人脸识别

人脸识别是计算机视觉领域中的一个重要研究方向,它可以通过分析和比对人脸图像,实现识别和验证的功能。希望通过这篇文章的学习,你对OpenCVSharp和人脸识别有了初步的了解,并能够运用这些知识进行自己的项目开发。当我们运行程序时,它会加载人脸识别模型并读取待识别的图像,然后进行人脸检测并在图像上标记出检测到的人脸位置。当然,这只是一个入门级的示例,实际的人脸识别系统还需要更加复杂的算法和大量的训练数据来提高准确性和鲁棒性。最后,我们遍历检测到的人脸,并在原始图像上绘制矩形框,标记出检测到的人脸位置。

WELL_CODER的博客 1129

LeetCode 面试经典 150 题回顾

最经典 150 题,掌握面试所有知识点 面试经典 150 题 : 题目分析、解题思路、复杂度分析、代码展示

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 8万+

poj2104 主席树(还是不太会)

这篇博客写的挺好的 推荐去看 https://blog.youkuaiyun.com/woshinannan741/article/details/53012682 Input The first line of the input file contains n — the size of the array, and m — the number of questions to answer (1 &lt...

h_666666的博客 280

10、进化动力学谱分析中的开放性问题

本文探讨了进化动力学谱分析中的若干开放性问题,重点围绕进化算法的性能与设计理论展开。文章首先介绍了规范模型及其线性动力学特性,随后深入分析了在实际应用中偏离理想情况的两个关键因素:有限种群和双亲重组。在此基础上提出了三个核心开放性问题:寻找最优传输矩阵以实现全局最优解的高效搜索、无限与有限种群模型谱之间的关系、以及卡林定理在多遗传算子下的推广可能性。通过谱条件、快速混合性与首次命中时间的关系分析,文章进一步讨论了全局吸引与快速收敛的理论基础,并提出了未来的研究方向,包括理论深化、实验拓展与跨学科融合,旨在为

cuda7parallel的博客 81

【划分树】求区间K大数

<br />       求区间K大数,众所周知有二分答案+树套树的做法,每个询问复杂度为O(log3N),可谓近似一个O(N)了,不仅时间复杂度高,编程复杂度也不低,后来才发现还有一种叫划分树的数据结构,专门做这种问题。<br />      本来觉得知道个树套树就够了,据我所知划分树还不支持区间修改操作,但是这次NOI一试的piano偏偏那出题人就有这么重口味,给你来两个500000的点!真是不简单,当时我都在想有没有O(N)的算法了。树套树的复杂度偏偏就被卡掉了,三个点平均每个点要跑5秒,好吧,那就学

Evil.livE 4382

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

acm专题学习之数据结构(一)划分树+POJ 2104

划分树: 1 功能:查询区间第k大 2 复杂度:logn 3 思路:主要是两步,一个是建树,一个是查询。 4 建树:找到序列的中位数,把大于中位数的扔到中位数的左边,小于中位数的扔到数的右边。这样就被分成了两个字区间,然后在子区间再重复相同的步骤,直到没有数字。(递归的过程) 使用分层的二维数组tree[20][maxn](一般十万级别的数字20层足够)。建树前需要重新排一次序,因为划分...

qq_40306845的博客 396

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

区间第K大数——划分树(POJ2104解题报告)

百度百科:划分树是一种基于线段树的数据结构。主要用于快速求出(在log(n)的时间复杂度内)序列区间的第k大值。 划分树的基本思想就是对于某个区间,把它划分成两个子区间,左边区间的数小于右边区间的数。查找的时候通过记录进入左子树的数的个数,确定下一个查找区间,最后范围缩小到1,就找到了。 建树 划分树建树的时间复杂度和线段树不同,划分树是O(nlogn),划分树的建树依赖一个排好序的数组

fmt.Println( 5228

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

poj 2104 K-th Number - 经典划分树

Description You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able

呼,是出一口气;吸,是争一口气! 1382

POJ 2104:K-th Number (划分树)

点击打开题目链接 题目意思,给出n和m,然后第二行给出n个数,接下来有m个循环,输入a,b,k,询问a,b这个区间中的第k小值是谁。 看到后也没思路,网上百度了一下,用划分树、主席树去做,这两个东西只听说过,但是没有用过,昨天2017多校 联合求区间第k大树,中间实在做不动了(绍兴中学毕业生出的题可真难,ORZ),所以就去学习划分树了,虽然多 校那个题目是可以模拟过的,划分树应该怼不过,因

温姑娘的博客 406

poj 2104 or poj2761 or hdu2665 划分树

也不知道别人会怎么看这代码里任性的注释 划分树定义为,:求区间第K大数查找整序列的第k大值往往采用。然而此方法会破坏原序列,并且需要O(n)的时间复杂度。抑或使用二叉平衡树进行维护,此方法每次查找时间复杂度仅为O(logn)。然而此方法丢失了原序列的顺序信息,无法查找出某区间内的第k大值。划分树的基本思想就是对于某个区间,把它划分成两个子区间,左边区间的数小于右边区间的数。查找的时候通过记录进入左

LH 585

poj2104 K大数 划分树

题意:给定一个数列,求一个区间的第K大数 模板题, 其中的newl, newr 有点不明白. 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 const int M = 100005; 5 int toLeft[20][M], tree[20]...

98

poj2104_划分树

在算法篇介绍过求这样的某一个范围内第k大的数的三种方法。 分治方法,对于求一组范围内的值可以考虑。但是求多组的时候就不行了,因为这种方法会改变原数组的排序。如果要有多组询问时,就必须赋值到另外一个数组中,结果TLE. 代码: View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include...

weixin_30722589的博客 104

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include #include #include #include #include #include #include

渐近自由 429

POJ2104_K-th number

题意: 给n个数,m次询问s,t,k,每次问[s, t]区间的第k大数 思路: 暴力: 排一次序,然后对于每次的询问[s, t],从头开始找那些在[s, t]的数(需要提前记录在原数组的下标),并用cnt计数,当cnt=k时就是该区间的第k大数。 #include <cstdio> #include <cstring> #include <algorithm> ...

CY05627的博客 360

POJ2104 K-th Number 划分树求区间第K大数

Problem Address:http://poj.org/problem?id=2104【前言】如果是多次查询数组任意区间的最值,那么线段树或者树状数组都可以,后者更易实现。但是如果是多次查询数组任意区间的第K最值,那么用划分树就更好。虽然看着还是不太明白,但还是写写报告吧,

Human_CK的专栏 748

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

题目链接: http://poj.org/problem?id=2104 解题思路: 由于查询的个数m非常大。朴素的求法无法在规定时间内求解。因此应该选用合理的方式维护数据来做到高效地查询。 假设x是第k个数,那么一定有 (1)在区间中不超过x的数不少于k个 (2)在区间中小于x的数有不到k个 因此。假设能够高速求出区间里不超过x的数的个数。就能够通过对x进行二...

aoe41606的博客 143

POJ 2104 K-th Number 归并树与划分树

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove 第一次接触,自己也没啥好总结的,都是看网上的资料。 归并树是在建树的过程中保存归并排序。 划分树是在建树的过程中保存快速排序。 其中归并树适合解决一个数在某个区间的名次。 划分树适合解决某个区间的K大数。 POJ这题是

窝不是爱酱,喵~~~~ 3438
上一篇: poj 3363 模拟(全0矩阵转换成特定的01矩阵)
下一篇: poj 3735/3070 矩阵快速幂(牛吃花生)
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值