【笔记】二分答案

二分答案 O(nlogm)

对一段有序的序列 每次二分,从而快速的查找。解决的问题常是“使最大值最小”或“使最小值最大”。

注意:①注意二分的序列是有序的,对于无序的序列进行二分需要先排序。

   ②二分的区间尽可能大(给定区间左右端点+-1)

   ③根据题目要求,设定好check函数。

   ④防止死循环。↓

模板:

 1 //第一种
 2 while(r-1>l)
 3 {
 4     int mid=(l+r)>>1;
 5     if(check(mid)) l=mid;
 6     else r=mid;
 7 }
 8 printf("%d",l);
 9 //第二种
10 //①
11 while(l<r)
12 {
13     int mid=(l+r)>>1;
14     if(check(mid)) l=mid+1;
15     else r=mid;
16 }
17 printf("%d",l-1);
18 //②
19 while(l<r)
20 {
21     int mid=(l+r)>>1;
22     if(check(mid)) l=mid;
23     else r=mid-1;
24 }
25 printf("%d",r);

例题:

【NOIP2015】【luogu2678】跳石头 →简单的二分,注意特判

【codevs2072】分配房间 →简单的二分,和跳石头很像,注意check函数的设定

【NOIP2016】【luogu1083】借教室 →较难,二分+差分

时间: 2024-08-28 22:12:17

【笔记】二分答案的相关文章

【算法学习笔记】52.一道题的三种方法..二分答案、动态规划、计算几何 SJTU OJ 1250 BestSubsequence

---恢复内容开始--- 1250. BestSubsequence Description LL有n个妹子,他给妹子们编号排成一排.据说今天天气大好,LL要去春游了,他决定要选定至少F个妹子一起去玩. 为了让妹子们开心,他决定选连续一段的妹子们.然后LL有个特殊的癖好,他喜欢体重比较厉害一些的妹子. 那你可以帮LL选妹子吗,使得选出来的这些妹子的平均体重最大. Input Format 输入第一行两个整数,n和F. 接下来n行,每行一个整数,表示妹子的体重. 对前50%的数据:1<=n<=2

【二分答案+智障的字符串hash】BZOJ2946-[Poi2000]公共串(Ranklist倒一达成!!!!!)【含hash知识点】

[题目大意] 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. [字符串hash的小笔记] hash[i]=(hash[i-1]*p+idx(s[i]))%mod,idx为映射值,一般a..z映射1..26: 习惯上,p取一个6到8位的素数即可,mod一般取大素数 1e9+7(1000000007)或1e9+9(1000000009). hash[i]=(hash[i-1]*p+idx(s[i]))%mod 表示第 i 个前缀的hash值,是一个hash的前缀和,那么,要求S[l…r]

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

HDU3081Marriage Match II(二分答案+并查集+最大流SAP)经典

Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2507    Accepted Submission(s): 856 Problem Description Presumably, you all have known the question of stable marriage match. A

Codeforce 371C Hamburgers (二分答案)

题目链接 Hamburgers 二分答案,贪心判断即可. 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define REP(i,n) for(int i(0); i < (n); ++i) 6 #define LL long long 7 8 char str[1010]; 9 LL len; 10 LL b, c, s, nb, nc, ns, pb, pc, ps; 11 LL money; 12 13 bool

POJ 3080 Blue Jeans(后缀数组+二分答案)

[题目链接] http://poj.org/problem?id=3080 [题目大意] 求k个串的最长公共子串,如果存在多个则输出字典序最小,如果长度小于3则判断查找失败. [题解] 将所有字符串通过拼接符拼成一个串,做一遍后缀数组,二分答案,对于二分所得值,将h数组大于这个值的相邻元素分为一组,判断组内元素是否覆盖全字典,是则答案成立,对于答案扫描sa,输出第一个扫描到的子串即可. [代码] #include <cstdio> #include <cstring> #inclu

IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) 二分答案 + 网络流

这道题的意思是给你一个有向图, 每条边上有一个最大载重量, 现在有x头牛要从顶点1走向顶点n, 每头牛要载的重量都是一样的, 问你最多能载多少的重量? 可以二分答案, 算出每头牛的载重, 然后修改边权, 跑一次最大流即可判断当前答案是否正确, 二分答案即可, 注意由于原始边权/每头牛的载重量可能会很大, 因此我们在修改边权时应该注意这一点,将边权的最大值控制在1000000之内, 防止溢出, 代码如下: #include <bits/stdc++.h> using namespace std;

BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流

题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连一条流量为k的边.两个人若互相喜欢则点1之间连边,不喜欢则点2之间连边 对于每个要验证的x值 将每个人的点1向源或汇连一条流量为x的边 然后二分答案跑最大流就可以 #include<cstdio> #include<cstring> #include<iostream> #

Educational Codeforces Round 3:D. Gadgets for dollars and pounds(二分答案+贪心)

看了菊苣的理解才知道怎么写..根本没思路啊一开始... 天数肯定在1~n之间,二分答案. 可以用保存前i天的最低美元和英镑汇率,没有规定哪天买,每天也没有购买数量限制,所以二分出一个答案mid的后,就在前mid天中汇率最低的时候一次性购入最便宜的就行了,judge一下总花费 打印答案的时候以ans为结果,再模拟一遍就好 #include"cstdio" #include"queue" #include"cmath" #include"s