当前位置: 首页 > 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;
}

相关文章:

  • [特殊字符] 分布式定时任务调度实战:XXL-JOB工作原理与路由策略详解
  • WGAN+U-Net架构实现图像修复
  • U盘能识别但无法写入数据的原因
  • 数据结构-图
  • 美团获全国首张低空物流全境覆盖运营合格证,其第四代无人机具备全域环境适应能力
  • 技术服务业-首套运营商网络路由5G SA测试专网在深光搭建完成并对外提供服务
  • JavaScript 的“积木”:函数入门与实践
  • 关于Spring Boot构建项目的相关知识
  • 7.9 Python+Click实战:5步打造高效的GitHub监控CLI工具
  • 机器学习(9)——随机森林
  • 使用 VMware 安装一台 Linux 系统之Ubuntu
  • JAVA---面向对象(上)
  • CSGO饰品盲盒系统源码搭建与仿站开发全解析
  • Sharding-JDBC 系列专题 - 第八篇:数据治理与高级功能
  • 【Python爬虫基础篇】--4.Selenium入门详细教程
  • java—14 ZooKeeper
  • Springboot3+ JDK21 升级踩坑指南
  • 实现营销投放全流程自动化 超级汇川推出信息流智能投放产品“AI智投“
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第三模块·面向对象深度进化 —— 第十二章 接口:比C函数指针更强大的契约
  • 身份证实名认证接口数字时代的信任基石-node.js实名认证集成
  • 漫画阅读APP刊载1200余部侵权作品:20人获刑,案件罚金超千万元
  • 68岁民营科技企业家、中国环保产业协会原副会长宋七棣逝世
  • 嫦娥五号月球样品将借给这些国家机构
  • “全国十大考古”揭晓:盘龙城遗址、周原遗址等入选
  • 厦门国贸去年营收约3544亿元,净利润同比减少67.3%
  • 从神舟五号到神舟二十号,每次任务标识藏着哪些逐梦星辰的密码