二分小专题

news2025/4/25 11:22:57

P1102 A-B 数对

P1102 A-B 数对
暴力枚举还是很好做的,直接上双层循环OK
二分思路:查找边界情况,找出最大下标和最小下标,两者相减+1即为答案所求
废话不多说,上代码

//暴力O(n^3) 72pts
// #include<bits/stdc++.h>
// using namespace std;
// const int N = 1100;
// int a[N],b[N],c[N];

// int main()
// {
//     int n;cin>>n;
//     int cnt = 0;
//     for(int i = 1;i <= n;i++)cin>>a[i];
//     for(int i = 1;i <= n;i++)cin>>b[i];
//     for(int i = 1;i <= n;i++)cin>>c[i];
//     for(int i = 1;i <= n;i++)
//     {
//         for(int j = 1;j <= n;j++)
//         {
//             for(int z = 1;z <= n;z++)
//             {
//                 if(a[i] < b[j] && b[j] < c[z] ) cnt++;
//             }
//         }
//     }
//     cout<<cnt<<"\n";
//     return 0;
// }

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
using ll = long long;
ll a[N],b[N],c[N];
ll n;
int bs1(int x)
{
    ll l = -1,r = n+1;
    while(l+1 != r)
    {
        ll mid = (l+r)>>1;
        if(a[mid] < x)
        {
            l = mid;
        }else 
        {
            r = mid;
        }
    }
    if(a[l] < x) return l;
    return 0;
}
int bs2(int x)
{
    ll l = -1,r = n+1;
    while(l+1 != r)
    {
        ll mid = (l+r)>>1;
        if(c[mid] <= x)
        {
            l = mid;
        }else 
        {
            r = mid;
        }
    }
    if(c[r] > x) return n-r+1;
    return 0;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n;
    ll cnt = 0;
    for(int i = 1;i <= n;i++)cin>>a[i];
    for(int i = 1;i <= n;i++)cin>>b[i];
    for(int i = 1;i <= n;i++)cin>>c[i];
    //因为要二分a[i]和c[i],所以我们需要对其进行排序操作

    sort(a+1,a+1+n);
    sort(c+1,c+1+n);
    for(int i = 1;i <= n;i++)
    {
        ll x = bs1(b[i]);
        ll y = bs2(b[i]);
        cnt += x * y;
    }
    cout<<cnt<<"\n";
    return 0;
}


P8667 [蓝桥杯 2018 省 B] 递增三元组

P8667 [蓝桥杯 2018 省 B] 递增三元组
一开始也是暴力做法,三层for循环拿到手
二分思想:观察这个式子我们可以看出,b[i] 介于a[i] 和 c[i] 之间,可以选择枚举b[i],再套用二分查找模板查找a[i]中小于b[i]的部分,还有c[i]中大于b[i]的部分
注意:该l,r的取值分别是 -1 和 n+1,因为你的c[i]最终要返回 n-r+1,所以你需要把指针定在n+1上,确保搜索范围的右边界在数组外。这样可以避免数组越界的问题
废话不多说,上代码

//暴力O(n^3) 72pts
// #include<bits/stdc++.h>
// using namespace std;
// const int N = 1100;
// int a[N],b[N],c[N];

// int main()
// {
//     int n;cin>>n;
//     int cnt = 0;
//     for(int i = 1;i <= n;i++)cin>>a[i];
//     for(int i = 1;i <= n;i++)cin>>b[i];
//     for(int i = 1;i <= n;i++)cin>>c[i];
//     for(int i = 1;i <= n;i++)
//     {
//         for(int j = 1;j <= n;j++)
//         {
//             for(int z = 1;z <= n;z++)
//             {
//                 if(a[i] < b[j] && b[j] < c[z] ) cnt++;
//             }
//         }
//     }
//     cout<<cnt<<"\n";
//     return 0;
// }

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
using ll = long long;
ll a[N],b[N],c[N];
ll n;
int bs1(int x)
{
    ll l = -1,r = n+1;
    while(l+1 != r)
    {
        ll mid = (l+r)>>1;
        if(a[mid] < x)
        {
            l = mid;
        }else 
        {
            r = mid;
        }
    }
    if(a[l] < x) return l;
    return 0;
}
int bs2(int x)
{
    ll l = -1,r = n+1;
    while(l+1 != r)
    {
        ll mid = (l+r)>>1;
        if(c[mid] <= x)
        {
            l = mid;
        }else 
        {
            r = mid;
        }
    }
    if(c[r] > x) return n-r+1;
    return 0;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n;
    ll cnt = 0;
    for(int i = 1;i <= n;i++)cin>>a[i];
    for(int i = 1;i <= n;i++)cin>>b[i];
    for(int i = 1;i <= n;i++)cin>>c[i];
    //因为要二分a[i]和c[i],所以我们需要对其进行排序操作

    sort(a+1,a+1+n);
    sort(c+1,c+1+n);
    for(int i = 1;i <= n;i++)
    {
        ll x = bs1(b[i]);
        ll y = bs2(b[i]);
        cnt += x * y;//每个 a[j] 可以与每个 c[z] 组合
    }
    cout<<cnt<<"\n";
    return 0;
}


P2440 木材加工

P2440 木材加工
很明显这道题就是二分答案,跟二分查找略显不同的是,它需要一个证明的过程判断结果的正确性
废话少说,上代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5+10;
ll a[N];
ll n,k;
bool check(int mid,int k)//长度为mid,段数为k
{
    int cnt = 0;
    for(int i = 1;i <= n;i++)
    {
        cnt += a[i] / mid;
    }
    if(cnt >= k)return true;
    else return false;
}
int main()
{
    cin>>n>>k;
    ll sum = 0;
    for(int i = 1;i <= n;i++)cin>>a[i];
    for(int i = 1;i <= n;i++)
    {
        sum += a[i];
    }
    if(sum < k)cout<<0<<"\n";
    else //需要二分之前先对木材进行排序
    {
        sort(a+1,a+1+n);
        ll l = -1,r = 1e8+10;
        while(l+1 != r)
        {
            ll mid = (l+r) >> 1;
            if(check(mid,k))
            {
                l = mid;
            }
            else r = mid;
        }
        cout<<l<<"\n";
    }
    return 0;
}

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

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

相关文章

Langchain检索YouTube字幕

创建一个简单搜索引擎&#xff0c;将用户原始问题传递该搜索系统 本文重点&#xff1a;获取保存文档——保存向量数据库——加载向量数据库 专注于youtube的字幕&#xff0c;利用youtube的公开接口&#xff0c;获取元数据 pip install youtube-transscript-api pytube 初始化 …

【Linux网络】应用层自定义协议与序列化及Socket模拟封装

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

客户案例:西范优选通过日事清实现流程与项目管理的优化

近几年来&#xff0c;新零售行业返璞归真&#xff0c;从线上销售重返线下发展&#xff0c;满足消费者更加多元化的需求&#xff0c;国内家居集合店如井喷式崛起。为在激烈的市场竞争中立于不败之地&#xff0c;西范优选专注于加强管理能力、优化协作效率的“内功修炼”&#xf…

LabVIEW实现Voronoi图绘制功能

该 LabVIEW 虚拟仪器&#xff08;VI&#xff09;借助 MathScript 节点&#xff0c;实现基于手机信号塔位置计算 Voronoi 图的功能。通过操作演示&#xff0c;能直观展示 Voronoi 图在空间划分上的应用。 各部分功能详细说明 随机地形创建部分 功能&#xff1a;根据 “Maximum a…

爬虫学习——获取动态网页信息

对于静态网页可以直接研究html网页代码实现内容获取&#xff0c;对于动态网页绝大多数都是页面内容是通过JavaScript脚本动态生成(也就是json数据格式)&#xff0c;而不是静态的&#xff0c;故需要使用一些新方法对其进行内容获取。凡是通过静态方法获取不到的内容&#xff0c;…

创新项目实训开发日志4

一、开发简介 核心工作内容&#xff1a;logo实现、注册实现、登录实现、上传gitee 工作时间&#xff1a;第十周 二、logo实现 1.设计logo 2.添加logo const logoUrl new URL(/assets/images/logo.png, import.meta.url).href <div class"aside-first">…

常见接口测试常见面试题(JMeter)

JMeter 是 Apache 提供的开源性能测试工具&#xff0c;主要用于对 Web 应用、REST API、数据库、FTP 等进行性能、负载和功能测试。​它支持多种协议&#xff0c;如 HTTP、HTTPS、JDBC、SOAP、FTP 等。 在一个线程组中&#xff0c;JMeter 的执行顺序通常为&#xff1a;配置元件…

计算机组成与体系结构:缓存(Cache)

目录 为什么需要 Cache&#xff1f; &#x1f9f1; Cache 的分层设计 &#x1f539; Level 1 Cache&#xff08;L1 Cache&#xff09;一级缓存 &#x1f539; Level 2 Cache&#xff08;L2 Cache&#xff09;二级缓存 &#x1f539; Level 3 Cache&#xff08;L3 Cache&am…

Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化?

Flutter 在全新 Platform 和 UI 线程合并后&#xff0c;出现了什么大坑和变化&#xff1f; 在两个月前&#xff0c;我们就聊过 3.29 上《Platform 和 UI 线程合并》的具体原因和实现方式&#xff0c;而事实上 Platform 和 UI 线程合并&#xff0c;确实为后续原生语言和 Dart 的…

stm32之GPIO函数详解和上机实验

目录 1.LED和蜂鸣器1.1 LED1.2 蜂鸣器 2.实验2.1 库函数&#xff1a;RCC和GPIO2.1.1 RCC函数1. RCC_AHBPeriphClockCmd2. RCC_APB2PeriphClockCmd3. RCC_APB1PeriphClockCmd 2.1.2 GPIO函数1. GPIO_DeInit2. GPIO_AFIODeInit3. GPIO_Init4. GPIO_StructInit5. GPIO_ReadInputDa…

用 PyQt5 和 asyncio 打造接口并发测试 GUI 工具

接口并发测试是测试工程师日常工作中的重要一环&#xff0c;而一个直观的 GUI 工具能有效提升工作效率和体验。本篇文章将带你用 PyQt5 和 asyncio 从零实现一个美观且功能实用的接口并发测试工具。 我们将实现以下功能&#xff1a; 请求方法选择器 添加了一个下拉框 QComboBo…

Qt实战之将自定义插件(minGW)显示到Qt Creator列表的方法

Qt以其强大的跨平台特性和丰富的功能&#xff0c;成为众多开发者构建图形用户界面&#xff08;GUI&#xff09;应用程序的首选框架。而在Qt开发的过程中&#xff0c;自定义插件能够极大地拓展应用程序的功能边界&#xff0c;让开发者实现各种独特的、个性化的交互效果。想象一下…

【Vue】TypeScript与Vue3集成

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. 前言2. 环境准备与基础搭建2.1. 安装 Node.js 与 npm/yarn/pnpm2.2. 创建 Vue3 TypeScript 项目2.2.1. 使用 Vue CLI2.2.2. 使用 Vite&#xff08;推荐&#xff09;2.2.3. 目录结构简述 3. Vue3 TS 基础语法整…

Linux之七大难命令(The Seven Difficult Commands of Linux)

Linux之七大难命令 、背景 作为Linux的初学者&#xff0c;肯定要先掌握高频使用的指令&#xff0c;这样才能让Linux的学习在短时间内事半功倍。但是&#xff0c;有些指令虽然功能强大&#xff0c;但因参数多而让初学者们很害怕&#xff0c;今天介绍Linux中高频使用&#xff0…

5.3.1 MvvmLight以及CommunityToolkit.Mvvm介绍

MvvmLight、CommunityToolkit.Mvvm是开源包,他们为实现 MVVM(Model-View-ViewModel)模式提供了一系列实用的特性和工具,能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。 本文介绍如下: 一、使用(旧)的MvvmLight库 其特点如下,要继承的基类是ViewModelBase;且使用…

Dbeaver 执行 SQL 语句和执行 SQL 脚本的区别

执行 SQL 语句 执行 SQL 语句对应图标&#xff1a; 适用于执行单个 SQL 的情形&#xff0c;默认是在光标处或选中的文本上执行 SQL 查询。 实际上同时选择多个 SQL 并通过该方式去执行也可能成功&#xff0c;只是有失败的风险。因此不建议使用它来同时执行多个 SQL 语句。 情况…

《Python3网络爬虫开发实战(第二版)》配套案例 spa6

Scrape | Moviehttps://spa6.scrape.center/ 请求影片列表api时&#xff0c;不仅有分页参数&#xff0c;还多了一个token&#xff0c;通过重发请求发现token有时间限制&#xff0c;所以得逆向token的生成代码。 通过xhr断点定位到接口请求位置 刷新页面或者点翻页按钮&#x…

Python基础语法:字面量,注释,关键字,标识符,变量和引用,程序执行的3大流程

目录 字面量&#xff08;数据的类型&#xff09; 字面量的含义 常见字面量类型&#xff08;6种&#xff09; 输出各类字面量&#xff08;print语句&#xff09; 注释&#xff08;单行和多行注释&#xff09; 注释的作用 单行注释和多行注释 单行注释&#xff08;ctrl/&a…

SPL 量化 获取数据

下载数据 我们将股票数据分享在百度网盘上供下载&#xff0c;每工作日更新。 目前可供下载的数据有 A 股的日 K 线数据、股票代码列表和上市公司的基本面数据 下载链接&#xff1a; 百度网盘 下载数据的文件格式为 btx&#xff0c;是 SPL 的特有二进制格式。 btx 称为集文…

Rust 学习笔记:安装 Rust

Rust 学习笔记&#xff1a;安装 Rust Rust 学习笔记&#xff1a;安装 Rust在 Windows 上安装 Rust命令行创建 Rust 项目在 Mac/Linux 上安装 Rust一些命令升级卸载cargo -hrustc -h 安装 RustRoverrust-analyzer Rust 学习笔记&#xff1a;安装 Rust 在 Windows 上安装 Rust …