首页 > 其他分享 >整体二分较详讲解

整体二分较详讲解

时间:2024-03-15 14:30:35浏览次数:21  
标签:二分 mid long 较详 num dfs 答案 讲解

看了前面所说的求第 K K K 大/小问题,在这里就不多赘述了.

先浅浅的谈一谈二分答案(如果会二分答案请直接调到整体二分部分)

二分答案

二分答案就是在答案满足单调性的时候优化 O ( N ) O(N) O(N) 的枚举答案暴力变为指数级的 O ( log ⁡ n ) O(\log_n) O(logn​)(有可能不止 O ( N ) O(N) O(N) 因为还有判断操作所以大部分暴力复杂度均为 O ( M N ) O(MN) O(MN) 甚至更高)适用于题目中让求最大\最小值问题且答案不唯一且有单调性

以枚举最小值为例
伪代码

int l=1 , r=答案最大的边界 ;// R 不判断是否合规
while(l<=r){
   
	int mid=(l+r)>>1 ;   //等同于(l+r)/2 ;
  if(mid满足答案要求) r = mid ; // 也可以为 r=mid-1 但是要单独用一个变量来存储 mid 当然也可以直接输出 r-1
  else l = mid+1 ; // 这里是不能写作 l=mid 否则会进入死循环
}
cout << r ;

先来一道例题试试水

例0

P1902 刺杀大使

这是一个很经典的利用答案的单调性枚举答案最小值的一道题目,判断答案就用dfs不会炸。

代码(可能有亿点丑)

#include<bits/stdc++.h>
using namespace std ;
long long n , m , a[1234][1234] , ans=0 ;
bool t[1234][1234] , ant ;
inline void dfs(long long x,long long y,long long num){
   
	if(x<1||y<1||x>n||y>m||t[x][y]||a[x][y]>num||ant) return ;
	if(x==n){
   ant=1 ; return;}
	t[x][y] = 1 ;
	dfs(x+1,y,num) ;
	dfs(x-1,y,num) ;
	dfs(x,y+1,num) ;
	dfs(x,y-1,num) ;
}
bool check(int num){
   
	ant = 0 ;
	memset(t,0,sizeof(t)) ;
	dfs(1,1,num) ;
	return ant ;
}
int main(){
   
	cin >> n >> m ;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%lld",a[i]+j) ;
	int l=1 , r=10000 ;
	while(l<=r){
   
		int mid = (l+r)>>1 ;
		if(check(mid)){
   
			r = mid-1 ;
			ans = mid ;
		}else{
   
			l = mid+1 ;
		}
	}
	cout << ans ;
	return 0 ;
}

看了整体二分前提二分答案,现在让我们来看看整体二分怎么做。(可以去参考一下线段树二分)

整体二分

整体二分,其实上是在 M M M 个询问中离线处理答案的算法,差不多算是在线使用 M M M 次二分答案的简便方法,所以整体二分的本质就是在同时二分 M M M 个答案,我们先定义一个函数 s o l v e ( l , r , L , R ) solve(l,r,L,R) solve(l,r,L,R) 其中 l l l 、 r r r 表示目前的答案在这个区间内, L L L、 R R R 表示是目前操作数组 a i a_i ai​ 满足在这个区间内的操作。

在整体二分合规的操作数组 a i a_i ai​ 中用 m i d mid mid( m i d = ⌊ l + r 2 ⌋ mid= \lfloor \frac{l+r}{2} \rfloor mid=⌊2l+r​⌋)表示答案。如果是修改操作,那么就将满足答案需求的 a i a_i ai​

标签:二分,mid,long,较详,num,dfs,答案,讲解
From: https://blog.csdn.net/Yale_dd/article/details/136738922

相关文章

  • vue3 中ref和reactive的区别讲解
    1.定于数据角度对比:ref用来定义:基本类型数据reactive用来定义:对象、或数组类型的数据备注:ref也可以用来定义对象或数组类型数据,它内部会自动通过reactive转为代理对象2.原理角度对比:ref通过Object.defineProperty()的get与set来实现响应式的(数据劫持)reactive通过......
  • 什么是缓存穿透,缓存击穿,缓存雪崩的详细讲解,以及解决方式?
    什么是缓存穿透,缓存击穿,缓存雪崩的详细讲解,以及解决方式?缓存作用:​ redis缓存加载数据库中的数据,数据库一般在磁盘中,访问磁盘的效率比较低,所以使用redis缓存,将数据加载到运存中,请求访问时直接访问缓存,如果缓存中有结果,直接返回结果,缓存中没有结果,请求会被打到数据库上,在数据库......
  • 七 超级数据查看器 讲解稿 详情2 搜索功能
    七 超级数据查看器 讲解稿  详情2搜索功能点击此处以新页面打开B站播放当前教学视频百度手机助手APP下载地址讲解稿搜索菜单。在这里可以完成搜索、定位等功能,比如我们在这里搜索幸福。点击显示字段搜索,随后会在当前显示的列当中,搜索关键字幸福,就是......
  • 【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
    leetcode链接题目描述给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,......
  • 计算机二级真题讲解每日一题:《高校分类》
    描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬修改编程模板,用代码替换横线,......
  • 基于微信小程序的公交信息在线查询系统小程序设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • 第八届蓝桥杯省赛 分巧克力(二分)
    题目描述:  思路:给出N个长方形的长和宽,可以分别看长能被分成多少块,宽能被分为多少块,也就是(h/mid)*(w/mid),使其大于等于K所以我们可以通过二分去找,最大的边长是多少AC代码: #include<iostream>usingnamespacestd;typedeflonglongLL;constintN=1......
  • (C++)二分
    二分​ 二分,他可以应用的范围特别广,即使是你想不到的地方他也可以二分。​ 例如:Acwing790数的三次方根这题可以直接二分题目所要求的答案,通过不断逼近三次方后的结果来二分;Acwing5407.管道,这题里可以直接二分时间,然后合并区间查看是否满足;Acwing730.机器人跳跃问题可以......
  • 【二分法】分巧克力问题/python
    1.看出是用二分法:最大值最小化,最小值最大化,满足条件的最值,用二分法做。2.确定low,high,确定check的条件3.注意: 是当low<high的时候进行循环,当相等或大于的时候输出,while的条件不能写错。 本题是在区间里面找满足条件的最大值,所以,在算mid的时候面对取整的问题让它向大......
  • java Spring boot2.7整合jetcache讲解CreateCache的area属性配置
    上文Springboot2.7整合jetcache远程redis缓存方案我们实现了一个redisjetcache缓存方案我们可以在application文件中的jetcacheremote下再加一组配置就先叫sms我们可以设置CreateCache上的area属性默认值是default这里我们可以修改成我们写的s......