Set 二分 -> 剑指算法竞赛

C++【STL】集合set

标准库提供 set 关联容器分为:

按关键字有序保存元素:set(关键字即值,即只保存关键字的容器)、multiset(关键字可重复出现的 set);
无序集合:unordered_set(用哈希函数组织的 set)、unordered_multiset(用哈希函数组织的 set,关键字可以重复出现)。

  ----集合--set:----------集合三要素----------------------------特点----------set---------multiste-----------unordered_set确定性        YES            YES               YES互异性        YES            NO                YES无序性        NO             NO                YES------------------------------------------------------------

优点:自动排序,自动去重 

set的定义

    set<类型名> 变量名;

同样也可以定义set数组。

    set<int> arr[10];

 set的遍历

for(set<int>::iterator it=se.begin();it!=se.end();it++){if(sign){cout<<*it;sign=0;}else{cout<<' '<<*it;}}

注意:除了 vector 和 string 以外的 STL 容器都不支持 *(it + i) 的访问方式

 常见操作

插入元素:数组名.insert();unordered_set时间复杂度为O(1),set为O(log N);
删除元素:数组名.erase();
查找元素:数组名.find()-----也可以用:数组名.count()会返回查找元素的个数
查看大小:数组名.size()
判空    :数组名.empty()
清空    :数组名.clear()

常见操作具体用法:内容参考 

由于set的用处并不是经常考,一些单一用set的题目过于简单,写上去有点太水了,因为我发誓以后不写水博客了,所以以后有更好的用搭配set优化的题目我再补充。

【算法】常见二分

下面来总结一下二分的板子:

为了方便以后的比赛整理模板,今天就先把二分的模板整理到这里了,有同样需求的小伙伴直接收藏即可。

二分查找:

使用前提:数组有序排列

参数为起始迭代器、终止迭代器以及给定元素值

lower_bound() :返回第一个大于等于给定元素的位置

upper_bound():返回第一个小于给定元素的位置

用法

 1.查找元素是否存在:

bool check(vector<int>& v, int value) {auto it = lower_bound(v.begin(), v.end(), value);return it != v.end() && *it == value;
}

2.向有序数组中插入元素:

void insert_to_sorted(vector<int>& v, int value) {auto pos = lower_bound(v.begin(), v.end(), value);v.insert(pos, value);
}

 

3.查找范围:

auto range = equal_range(v.begin(), v.end(), value);
// 等同于:
auto low = lower_bound(v.begin(), v.end(), value);
auto up = upper_bound(v.begin(), v.end(), value);

二分答案:

二分答案是一种对答案进行二分查找的算法,适用于满足以下条件的问题:

问题的答案具有单调性(随着某个变量的增大,结果单调递增或递减)

可以相对容易地验证某个候选答案是否可行

与传统的二分查找比较:

二分答案的模板有很多,我会总结出我经常用到的一种:

首先是整数二分答案模板:

整形二分

如果求的是最大的最小值(满足条件的最大值,较靠右端的答案)可以用(l+r+1)>>1;

如果是求最小的最大值(满足条件的最小值,较靠左端的答案),可以用(l+r)>>1;

int l=1,r=1e18;while(l<r){int mid = (l+r+1)>>1;if(check(mid)) l = mid(r = mid);//更新左/右边界else r = mid-1(l = mid + 1);//更新左/右边界}cout<<l<<endl;

二分答案难就难在check函数的编写,check函数顾名思义就是把当前的mid(可能的答案值)代入问题中看是否符合要求 。

有了理论和模板,下面就是不断的练习了:

进击的奶牛

这道题题目意思读不懂,但是和跳石头差不多,直接写就行了。

check函数的难点在于需要用一个变量来存储上一个选择的位置。

// Problem: P1824 [USACO05FEB] 进击的奶牛 Aggressive Cows G
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1824
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define PII pair<int,int>
#define fi first
#define se second
const int N = 1e5+10;
int a[N];
int n,m;bool check(int mid)
{int num=1;int f=1;for(int i=2;i<=n;i++){if(a[i] - f >= mid){num++;f = a[i];}}return num>=m;
}void solve()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);int l=1,r=1e18;while(l<r){int mid = (l+r+1)>>1;if(check(mid)) l = mid;else r = mid-1;}cout<<l<<endl;
}signed main()
{IOSint T=1;
//	cin>>T;while(T--) solve(); return 0;
} 

推荐练习题:

1、跳石头

2、砍树

3、冶炼金属

浮点型二分

这中类型题的模板也有很多,有的是在给定的误差范围内进行微调,有的是判断条件进行误差分析并通过浮点数自身的精确度来调整答案,其中一种个人认为比较保险的是下面的这种:

double l = 0,r = 1e18;while(r - l > 1e-5){double mid = (l + r) / 2.0;if(check(mid)) l = mid;else r = mid;}

有了模板,难点同样成为了check函数的编写。。。

来看题目:
切绳子

这是一道基础的题目,check函数很好想出来,这道题的难点反而成为了浮点二分答案的记忆

 只需要遍历一遍看能切出来多少条绳子即可。

// Problem: P1577 切绳子
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1577
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define PII pair<int,int>
#define fi first
#define se second
int n,k;
const int N = 10010;
double a[N];
bool check(double mid)
{int num=0;for(int i=1;i<=n;i++){num += (int)(a[i] / mid);}	return num>=k;
}void solve()
{cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];double l = 0,r = 1e18;while(r - l > 1e-5){double mid = (l + r) / 2.0;if(check(mid)) l = mid;else r = mid;}printf("%.2f",l);
}signed main()
{// IOSint T=1;
//	cin>>T;while(T--) solve(); return 0;
} 

推荐练习题:

最佳牛围栏

总结:

今天是第五天了,这周就属今天最轻松了,之后这周末我会整理整理这周所学的内容,我们下周见!

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

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

相关文章

php的原生类

前言&#xff1a;累麻了&#xff01; 反射类 反射类 ReflectionClass&#xff1a;ReflectionClass 类报告了一个类的有关信息。正如其名用于映射反射一个类的类&#xff01; new ReflectionClass(MyClass) 会创建一个 ReflectionClass 实例&#xff0c;代表 MyClass 这个类。 …

PC网站和uniapp安卓APP、H5接入支付宝支付

首先我们需要完成支付宝账号注册&#xff0c;支持的账号类型&#xff1a;支付宝企业账号、支付宝个人账号、个体工商户。 到支付宝商家平台 产品中心开通APP支付、手机网站支付、电脑网站支付的产品权限。 一、电脑PC网站接入 电脑PC网站支付是指商户在电脑网页展示商品或服务&…

MCU芯片内部的ECC安全机制

MCU&#xff08;微控制器单元&#xff09;芯片内部的 ECC&#xff08;错误检测与纠正&#xff09;安全机制 是一种至关重要的硬件级可靠性技术&#xff0c;主要用于保护关键存储单元&#xff08;如 SRAM、Flash、Cache&#xff09;中的数据完整性&#xff0c;防止因外部干扰或硬…

【自动驾驶】经典LSS算法解析——深度估计

LSS-Lift.Splat,Shoot 论文题目&#xff1a;Lift, Splat, Shoot: Encoding Images From Arbitrary Camera Rigs by Implicitly Unprojecting to 3D 代码&#xff1a;https://github.com/nv-tlabs/lift-splat-shoot 概括&#xff1a;先做深度估计和特征融合&#xff0c;然后投…

《【第八篇-图片总结篇】Python图片处理自动化:终极工厂!从裁剪压缩到智能加水印,打造你的视觉内容生产流水线!》

在数字时代&#xff0c;图片无处不在。然而&#xff0c;高质量的图片背后&#xff0c;往往隐藏着繁琐的后期处理&#xff1a;图片文件太大导致加载慢&#xff1b;尺寸不符需要裁剪&#xff1b;版权保护要加水印&#xff1b; 为了兼容性还得批量转换格式……这些重复、机械的工…

frame 与新窗口切换操作【selenium 】

&#x1f9ed; 一、切换到 iframe 内部进行操作在浏览器自动化测试中&#xff0c;iframe 是一个特别的存在。它相当于在当前页面中嵌入了另一个独立的 HTML 页面。当我们试图直接访问 iframe 中的元素时&#xff0c;往往会发现定位不到&#xff0c;比如&#xff1a;elements w…

MYSQL C_API使用全解

文章目录C_API&#xff08;简单的&#xff09;安装这个库使用流程初始化连接mysql_init建立连接mysql_real_connect执行SQL语句mysql_query处理结果mysql_store_resultmsyql_use_resultmysql_num_rowsmsyql_free_resultmysql_num_fieldsmysql_fetch_row多线程安全关闭连接mysql…

闲庭信步使用图像验证平台加速FPGA的开发:第二课——RGB转YCbCr的FPGA硬件编程详解

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程文件请关注…

RK3566/RK3568 Android11 修改selinux模式

概述RK3566/RK3568 Android11 SDK默认的selinux是Enforcing模式(强制模式)。Enforcing&#xff1a;强制模式&#xff1a;SELinux在运行中&#xff0c;且已经开始限制domain/type之间的验证关系 Permisssive&#xff1a;宽容模式&#xff1a;SELinux在运行中&#xff0c;如果验证…

iOS Widget 开发-3:Widget 的种类与尺寸(主屏、锁屏、灵动岛)

iOS 支持多种类型的 Widget&#xff0c;分布在主屏幕、锁屏、灵动岛、待机模式、控制中心等多个系统位置。每种 Widget 都有各自的尺寸、交互能力与限制。 本篇将系统梳理 iOS 当前支持的 Widget 类型与尺寸规格。主屏 Widget&#xff08;Home Screen Widgets&#xff09; 主屏…

ffmpeg 中 write_option()函数详细注释

author: hjjdebug date: 2025年 07月 11日 星期五 10:51:23 CST descrip: ffmpeg 中 write_option()函数详细注释 文章目录1. 函数原型1.1 参数说明1.2 SpecifierOpt 说明符选项结构2. write_option 代码注释2.1 谁调用了write_option 函数?3. 小结:write_option()不仅在ffmpe…

PandaCoder重大产品更新-引入Jenkinsfile文件支持

写在前面 安装这个插件可以直接平替 Jenkinsfile Pro &#xff0c;节省200元关于插件介绍的处女篇&#xff1a;https://mp.weixin.qq.com/s/fwMEhmx8vxVlvfnipx09Ag为什么叫「熊猫编码助手」&#xff1f; 熊猫是中国的国宝&#xff0c;备受世界喜爱&#xff0c;代表着中国特色和…

链表算法之【判断链表中是否有环】

目录 LeetCode-141题 LeetCode-141题 给定一个链表的头节点&#xff0c;判断链表中是否存在环 class Solution {public boolean hasCycle(ListNode head) {// checkif (head null || head.next null)return false;// 定义两个指针&#xff0c;一个快指针[fast]&#xff0c…

Ubuntu 22.04安装SQL Server指南

看起来在安装过程中出现了问题&#xff0c;导致 mssql-server 没有正确安装。以下是排查和修复步骤&#xff1a;1. 检查是否成功安装了 mssql-server 运行以下命令&#xff0c;确认是否已安装&#xff1a; dpkg -l | grep mssql-server如果没有任何输出&#xff0c;说明 mssql-…

Vue+ElementUI聊天室开发指南

Hi&#xff0c;我是布兰妮甜 &#xff01;在现代Web应用中&#xff0c;实时聊天功能已成为许多社交平台、协作工具和客户支持系统的核心需求。本文将详细介绍如何使用Vue.js框架配合ElementUI组件库实现一个功能完整的聊天室应用。我们将从项目搭建开始&#xff0c;逐步实现用户…

提升你的AI交互技能:使用Anthropic互动提示教程

探索Anthropic的互动式提示工程教程&#xff1a;让Claude与你更默契 在当今人工智能世界中&#xff0c;熟练掌握有效的提示工程成为了与AI进行高效沟通的关键。Anthropic推出了一款全面且互动性强的教程&#xff0c;名为“Prompt Engineering Interactive Tutorial”&#xff0…

从 JavaFX WebView 迁移至 JxBrowser

长久以来&#xff0c;JavaFX 一直包含一个内置的 WebView 组件&#xff0c;这是在 Java 应用中渲染 Web 内容的一个稳定方案。然而&#xff0c;在更复杂或要求更高的使用场景中&#xff0c;它可能就不够用了。因此&#xff0c;许多开发者转向了像 JxBrowser 这样的替代方案。 …

将 Go 应用从 x86 平台迁移至 Amazon Graviton:场景剖析与最佳实践

简介 近年来&#xff0c;Amazon Graviton 处理器以其优越的性价比和强劲的性能&#xff0c;成为了构建高效、可扩展云原生应用的重要选择。Graviton 采用基于 Arm64 架构的芯片&#xff0c;与传统的 x86 架构相比存在不少架构差异。虽然 Go 天生对 Arm64 具有良好支持&#xf…

arcgis api for js 设置地图服务请求带有请求头信息

通过地图的config模块的请求拦截器来设置请求头信息&#xff0c;如下示例&#xff1a; 1、引入&#xff1a;‘esri/config’ 1、设置请求头信息 import { loadArcgisModules } from /utils/map/mapLoadUtil export default { mounted() {this.loadMap()}, methods: {/** ****…

工业通信升级新选择:耐达讯CCLINKIE转Modbus TCP网关

在工业自动化系统中&#xff0c;协议转换网关的选择直接影响系统稳定性与通信效率。对于CCLINKIE转Modbus TCP场景&#xff0c;耐达讯通信技术网关凭借以下特性&#xff0c;成为多个项目中的优选方案。技术选型要点协议兼容性支持CCLINKIE的令牌环机制与Modbus TCP的TCP/IP协议…