POJ2104 (平方分割)二分查找理解。

题意:任意区间求第k大数

思路:

  预处理:利用平方分割(分桶法)把区间切割成B = sqrt(n)大小的一块块,然后每个各自排序。

  二分第k大数x,接着就需要求[l,r]区间中x的排名,与k比较,将两边端点非完整桶的点进行扫描,最多B次,其余每个桶进行二分查找排名,可利用upper_bound(STL)即可快速实现。

评价:

  二分确实坑爹,不过搞了这一题也算对二分查找理解深入了些。

二分正确做法:

对于[0..n-1)有[0..m]满足性质其余不满足, 则应用[l, r)进行二分查找, 最后l一定是正确的。总是保证l不成立,r成立。

l = -1, r = n;
while(l < r-1)
{int mid = (l+r)/2;if(check(mid))l = mid;elser = mid;
}
cout << l << endl;

而若是[m, n-1]满足性质, 则应用(l, r]进行二分查找, 最后r一定正确,反之即可。

 

保证(l, r]正确性

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define INF 0x3f3f3f3f
#define MAXN 200005
#define B 1000using namespace std;vector<int> bucket[MAXN/B];
int a[MAXN], q[MAXN], n, m, x, y, k;int main()
{scanf("%d%d", &n, &m);for(int i = 0; i < n; i ++){scanf("%d", &a[i]);q[i] = a[i];bucket[i/B].push_back(a[i]);}sort(q, q+n);for(int i = 0; i < MAXN/B; i ++)sort(bucket[i].begin(), bucket[i].end());while(m --){scanf("%d%d%d", &x, &y, &k);x--, y;int l = -1, r = n-1; //(l, r]while(l < r-1){int mid = (l+r)/2;int tx = x, ty = y;int cnt = 0;for( ; tx < ty && tx%B != 0; tx ++)if(a[tx] <= q[mid]) cnt ++;for( ; tx < ty && ty%B != 0; ty --)if(a[ty-1] <= q[mid]) cnt ++;for(int i = tx/B; i < ty/B; i ++)cnt += upper_bound(bucket[i].begin(), bucket[i].end(), q[mid])-bucket[i].begin();if(k <= cnt)r = mid;elsel = mid;}if(r < 0)printf("-1");elseprintf("%d\n", q[r]);}return 0;
}
View Code

 

例如本题若换成[l, r)正确性,稍加改动即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define INF 0x3f3f3f3f
#define MAXN 200005
#define B 1000using namespace std;vector<int> bucket[MAXN/B];
int a[MAXN], q[MAXN], n, m, x, y, k;int main()
{scanf("%d%d", &n, &m);for(int i = 0; i < n; i ++){scanf("%d", &a[i]);q[i] = a[i];bucket[i/B].push_back(a[i]);}sort(q, q+n);for(int i = 0; i < MAXN/B; i ++)sort(bucket[i].begin(), bucket[i].end());while(m --){scanf("%d%d%d", &x, &y, &k);x--, y;int l = 0, r = n; //[l, r)while(l < r-1){int mid = (l+r)/2;int tx = x, ty = y;int cnt = 0;for( ; tx < ty && tx%B != 0; tx ++)if(a[tx] < q[mid]) cnt ++;for( ; tx < ty && ty%B != 0; ty --)if(a[ty-1] < q[mid]) cnt ++;for(int i = tx/B; i < ty/B; i ++)cnt += lower_bound(bucket[i].begin(), bucket[i].end(), q[mid])-bucket[i].begin();if(cnt < k)l = mid;elser = mid;}printf("%d\n", q[l]);}return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Mathics/p/4155655.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——leetcode237 删除链表中的结点

1 题目 237. 删除链表中的节点 难度简单 请编写一个函数&#xff0c;用于 删除单链表中某个特定节点 。在设计函数时需要注意&#xff0c;你无法访问链表的头节点 head &#xff0c;只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点 不是末尾节点 。 示例 1&am…

机器学习的练功心法(一)——机器学习概述

1 机器学习概述 文章目录1 机器学习概述1.1 学习方法1.2 什么是机器学习1.3 监督学习1.4 无监督学习1.5 强化学习1.6 机器学习的开发流程1.1 学习方法 引入&#xff1a;对于机器学习来说&#xff0c;我们需要有一个大局观&#xff0c;什么是大局观&#xff1f;你站的比别人高&…

项目管理规范

从鼬加入的那一周开始&#xff0c;四代就开始着手准备起草代码规范了。代码规范不可少很多人理直气壮的认为&#xff0c;创业团队&#xff0c;或者说人数少的团队根本不需要代码规范。他们的口头禅经常是&#xff1a;“没办法啊&#xff01;我们需要快速的完成客户的需求啊&…

每日一题——王道考研2.2.4.1

1 题目 从顺序表中删除具有最小值的元素&#xff08;假设唯一&#xff09;&#xff0c;并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 ——出自王道书2023版2.2.4的第二大题第一小题 2 思路 既然…

批处理启动vm虚拟机服务 vm12启动无界面启动vm虚拟机系统 windows上如何操作服务 sc net启动关闭服务...

windows(win10)批处理脚本 打开vm虚拟机的服务,并且开启无界面虚拟机 echo off net start "vds" net start "VMAuthdService" net start "VMnetDHCP" net start "VMware NAT Service" net start "VMUSBArbService" net star…

机器学习的练功心法(二)——概述

2 概述 文章目录2 概述2.1 模型概述2.1.1 预测房价问题2.1.2 符号2.2 代价函数2.3 代价函数的用处2.4 回到问题2.5 梯度下降2.6 梯度下降知识点总结2.7 线性回归模型的梯度下降2.1 模型概述 2.1.1 预测房价问题 在我们要开始下面的问题前&#xff0c;我们先来看一些关于房价预…

Jquery对象和DOM对象---Jquery API (1)

文&#xff0f;饥人谷_韩宝亿&#xff08;简书作者&#xff09;原文链接&#xff1a;http://www.jianshu.com/p/98a0c82c47e4著作权归作者所有&#xff0c;转载请联系作者获得授权&#xff0c;并标注“简书作者”。一、为什么要用Jquery? DOM API 1.难用 要想拿到一个对象&…

机器学习的练功心法(三)——特征工程

文章目录致谢3 特征工程3.1 Sklearn工具及数据集3.2 数据集3.3 数据集的划分3.4 特征工程介绍3.4.1 为什么需要特征工程3.4.2 什么是特征工程3.4.3 特征提取3.4.3.1 字典特征提取3.4.3.2 文本特征提取3.4.3.3 中文文本特征提取3.4.3.4 TF-IDF算法3.5 特征预处理3.5.1 特征预处理…

数据库杂谈(六)——数据库管理系统

文章目录6 数据库管理系统6.1 数据库管理系统结构简介6.2 进程结构6.2.1 进程的分类6.2.2 线程的由来6.2.3 建立进程的过程6.3 数据目录6 数据库管理系统 6.1 数据库管理系统结构简介 数据库管理系统DBMS是数据库系统的核心。而目前市场上我们接触到的商品化DBMS大多数是关系…

booth算法实现乘法器

booth算法充分的利用到了补码的重要性&#xff0c;使得我们在利用补码进行计算时减少了很多时序。下面的表格是我们假设2 作为乘数所进行的分析。接下来&#xff0c;我将用代码向大家阐述。 1、开始的时候在乘数2的‘负一位’加上一个默认0值00100 2、先判断[0:-1],结果是2‘b0…

OS实验一实验报告

实验一、命令解释程序的编写实验 专业&#xff1a;商业软件工程 姓名&#xff1a;王泽锴 学号&#xff1a;201406114113 一、实验目的 &#xff08;1&#xff09;掌握命令解释程序的原理&#xff1b; &#xff08;2&#xff09;*掌握简单的DOS调用方法&#xff1b; &#xf…

机器学习的练功方式(四)——KNN算法

文章目录致谢致歉4 KNN算法4.1 sklearn转换器和估计器4.1.1 转换器4.1.2 估计器4.2 KNN算法4.2.1 概述4.2.2 电影类型分析4.2.3 算法实现致谢 闵氏距离_百度百科 (baidu.com) 机器学习之KNN&#xff08;k近邻&#xff09;算法详解_平原的博客-CSDN博客_knn 鸢尾花(Iris)数据集_…

数据库杂谈(七)——数据库的存储结构

文章目录7 数据库的存储结构7.1 数据库访问管理-文件组织7.2 数据库访问管理——索引技术7 数据库的存储结构 让我们重新温习第六讲的所学知识。 这个图实际上我们要关注的是蓝色箭头指向的那一层。在这一层之上&#xff0c;我们都是对SQL语句动手&#xff0c;而在这一层之下&…

JSP中直接在输入框中校验

jsp: <label class"control-label col-sm-2" for"codeAdd">险种代码<span style"color: red;">*</span></label> <div classcontrols col-sm-4> <input class"form-control remote-validate" data-r…

【iCore3 双核心板_FPGA】例程十二:Modelsim仿真实验

实验指导书及代码包下载&#xff1a; 链接&#xff1a;http://pan.baidu.com/s/1hs4zNFY 密码&#xff1a;5z62 iCore3 购买链接&#xff1a; https://item.taobao.com/item.htm?id524229438677

机器学习的练功方式(五)——模型选择及调优

文章目录5 模型选择及调优5.1 数据增强5.2 过拟合5.3 交叉验证5.4 超参数搜索——网格搜索5 模型选择及调优 5.1 数据增强 有时候&#xff0c;你和你的老板说你数据不够&#xff0c;它是不会理你的。老板会发问&#xff1a;为什么你是做机器学习的要那么多数据干嘛&#xff0…

关于内存的一些基础知识

1、free&#xff1a;Display amount of free and used memory in the system. free显示的数值来自/proc/meminfo&#xff08;默认单位是KB&#xff09;。各个项的含义分别是&#xff1a; 1&#xff09;Mem这一行&#xff0c;shared&#xff1a;已废弃&#xff1b;buffers&#…

Flask 单例模式 session

一、单例模式 单例模式分为四种&#xff1a;基于文件的单例模式&#xff0c;基于类方法的单例模式&#xff0c;基于__new__的单例模式&#xff0c;基于metaclass的单例模式 1. 基于类方法的单例模式 - 不支持多线程模式 import threadingclass Singleton(object):def __init__(…

数据处理工具(一)——Matplotlib

文章目录致谢1 Matplotlib1.1 什么是Matplotlib1.2 实现一个简单的图1.3 Matplotlib三层结构1.3.1 容器层1.3.2 辅助显示层1.3.3 图像层1.3 使用模块1.3.1 画布的设置1.3.2 添加网格辅助背景1.3.3 附加属性1.3.4 标签1.3.5 刻度1.3.6 一个图上多条线1.3.7 子区域1.4 基础图表1.…

Java解析Rss(三)

2019独角兽企业重金招聘Python工程师标准>>> package com.ninemax.application.rss;import java.net.URL; import java.text.SimpleDateFormat; import java.util.List;import com.sun.syndication.feed.synd.SyndCategory; import com.sun.syndication.feed.synd.S…