首页 > 其他分享 >二分模板 Acwing 789 数的范围

二分模板 Acwing 789 数的范围

时间:2023-10-31 18:44:21浏览次数:34  
标签:二分 判断 int scanf mid 789 此时 模板 Acwing

 

二分一定有解,若出现无解,一定是题目中无解二分步骤:定义check函数,先找到一个x,使得区间左边满足条件区间右边不满足条件,

定义mid = l + r >> 1去判断于x的关系,此时需要判断边界关系,例如当a[mid]小于x时,说明二分值在x的左边,此时缩小范围为【mid,r】,

即令 l = mid,此时返回check函数,使 mid = l + r +1 >> 1,因为在这里mid是向下取整,不加一的话,当 l  = r - 1是 ,mid = l,此时循环后的区间

还是【l,r】,会形成死循环,所以 + 1后范围会变成 mid = r ,得到我们的x的第一次出现的值,在循环最后一次,我们的 l 和 r都在x 的两侧

此时 l = r = x,因此当无解时,判断最后一轮a[ l ] != x ,即为无解,此题要判断两次,所以再进行一次二分,判断x的结束的位置,以下为代码

 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int N = 100010;
 5 int n,m;
 6 int a[N];
 7 
 8 int main()
 9 {
10     scanf("%d%d", &n, &m);
11     for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
12     
13     while (m -- )
14     {
15         int x,l = 0, r = n - 1;
16         scanf("%d", &x);
17         
18         while(l < r)
19         {
20             int mid = l + r >> 1;
21             if(a[mid] >= x) r = mid;
22             else l = mid + 1;
23         }
24         if(a[l] != x) cout <<"-1 -1" << endl;
25         
26         else
27         {
28             cout << l << ' ';
29             
30             int l = 0,r = n - 1;
31             
32             while(l < r)
33             {
34                 int mid = l + r + 1>> 1;
35                 if(a[mid] <= x)  l = mid ;
36                 else r = mid - 1;
37             }
38             cout << l << endl;
39         }
40     }
41     return 0;
42 }

 

标签:二分,判断,int,scanf,mid,789,此时,模板,Acwing
From: https://www.cnblogs.com/rw666/p/17800994.html

相关文章

  • 洛谷P3805 【模板】manacher
    题目链接:https://www.luogu.com.cn/problem/P3805manacher算法模板题。参考资料:https://oi-wiki.org/string/manacher/示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2.2e7+5;intn;chars[maxn/2],a[maxn];intp[maxn];voidinit(){......
  • Mac OS XML禁用app模板 配合work space one 使用
    参考link:https://www.youtube.com/watch?v=NOVZpp2kNUA支持禁用字段:name/cdhash/path/bundleId1<dict>2<key>Restrictions</key>3<array>4<dict>5<key>Attributes</key>6&......
  • java根据模板生成表格和列表
    1、模板所有的标签都是以{{开始,以}}结束。{{template}}文本{{@template}}图片{{#template}}表格{{*template}}列表{{+template}}Word文档合并{{?template}}{{/template}}if和foreach功能 2、引入包<!--POI依赖使用xlsxxml的格式(即X......
  • 装饰器模板
    双层装饰器defoutter(func):defwrapper(*args,**kwargs): #wrapper是未来要运行的函数#此处加功能res=func(*args,**kwargs) #func是被装饰的函数returnresreturnwrapper三层装饰器:给双层装饰器加参数的defsanceng():......
  • django基础到高手知识笔记总结 共4大模块50页md文档 第2章:django视图和模板的使用
    当你考虑开发现代化、高效且可扩展的网站和Web应用时,Django是一个强大的选择。Django是一个流行的开源PythonWeb框架,它提供了一个坚实的基础,帮助开发者快速构建功能丰富且高度定制的Web应用完整版笔记直接地址:请移步这里共10章,31子模块,总计18647字工程搭建学习目标......
  • 提高组常见模板总结
    注$^1$:本文中带有~~小粉兔~~字样的文字均指不怎么重要的东西。~~主要是不会~~注$^2$:马蜂良好,可以超,没问题的##~~【小粉兔】~~区间数据结构###1.ST表适用范围:有函数$f$使得$x=f(x,x)$,如$\max,\gcd$等。代码实现:```cppvoidinit(){ for(inti=0;i<n;i++)s......
  • 【模板】自动清空数组 acarray
    这个板子有什么意义?检测对编译器的了解程度。template<classT,intN>structacarray{Tval[N],rev;inttim,vis[N];structrefer{int*tim,*vis;T*val,*rev;refer()=delete;refer(acarray&a,size_tpos):tim(&a.tim),vi......
  • AcWing 3559. 围圈报数
    考点:约瑟夫环问题,环形链表,队列#include<bits/stdc++.h>usingnamespacestd;constintN=55;intne[N];//链表指针数组intmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intt;cin>>t;while(t--){i......
  • Acwing127周赛第三题 构造矩阵 (套路)
    题目链接:构造矩阵题目描述我们希望构造一个n×m的整数矩阵。构造出的矩阵需满足:每一行上的所有元素之积均等于k。每一列上的所有元素之积均等于k。保证k为1或−1。请你计算,一共可以构成出多少种不同的满足条件的矩阵。由于结果可能很大,你只需要输出对109+7......
  • WPF 控件模板
    控件模板WPF的ControlTemplate是一种用于定义和自定义控件的外观和结构的模板,它可以完全替换控件的默认模板,实现个性化和复杂的效果。WPF的ControlTemplate有以下几个特点:ControlTemplate是一个XAML元素,它可以包含任何类型的UI元素,如布局、形状、图像、文本等,这些元素......