二分


二分模板有两个

当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,
其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。

while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }

当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,
其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。

while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }

模板参考yxc大佬的讲解


Author: 眼里有星星
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 眼里有星星 !
 Previous
K倍区间 K倍区间
给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K倍区间。你能求出数列中总共有多少个 K倍区间吗?输入格式第一行包含两个整数 N和 K。
2020-02-23
Next 
01背包 01背包
题目有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。第 i件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分
2020-02-23
  TOC