当前位置: 首页 > news >正文

二分小专题

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.xdnf.cn/news/118585.html

相关文章:

  • 1Panel+Halo快速部署:简化服务器管理与网站搭建流程探索
  • MySQL 报错解析:SQLSyntaxErrorException caused by extra comma before FROM
  • 美团获全国首张低空物流全境覆盖运营合格证,其第四代无人机具备全域环境适应能力
  • redis经典问题
  • Redis 基础和高级用法入门
  • 【每天一个知识点】熵(Entropy)
  • Redis 核心应用场景
  • Linux 网络基础三 (数据链路层协议:以太网协议、ARP 协议)
  • Linux系统的延迟任务及定时任务
  • 济南国网数字化培训班学习笔记-第二组-6-输电线路现场教学
  • 一个开源且具有直观视觉界面的 API,可实现 DeepSeek 与 SillyTavern 的非官方集成。
  • 关于QT信号、槽、槽函数的讲解
  • Flutter Dart 循环语句 for while do..while break、continue
  • 第二章、安全认证
  • JavaWeb:Web介绍
  • 【Java实战经验】泛型-类型灵活使用与限制
  • 在线地图工具geojson.io
  • 【数据可视化-28】2017-2025 年每月产品零售价数据可视化分析
  • 第53讲 农学科研中的AI伦理与可解释性——探索SHAP值、LIME等可解释工具与科研可信性建设之道
  • 【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识(3)
  • Linux的时间函数
  • 【k8s】k8s是怎么实现自动扩缩的
  • 移动通信行业术语
  • centos7使用yum快速安装最新版本Jenkins-2.462.3
  • 第六章 QT基础:6、QT的Qt 时钟编程
  • C语言编程--15.四数之和
  • Sharding-JDBC 系列专题 - 第十篇:ShardingSphere 生态与未来趋势
  • NLP高频面试题(五十三)——深度学习正则化详解
  • JAVA设计模式——(六)装饰模式(Decorator Pattern)
  • Matlab 复合多层结构的隔声研究