手动 O2 优化

  1. #pragma GCC optimize(2)

关于二分

Trick! - 图1,则根据序列 Trick! - 图2 的单调性,Trick! - 图3 之前的数会更小,所以 Trick! - 图4 的最大的数不可能在 Trick! - 图5 之前,可行区间应缩小为右半段,因为 Trick! - 图6 也可能是答案,故此时应该取 Trick! - 图7。同理,若 Trick! - 图8,取 Trick! - 图9
观察可得:

  1. 缩小范围时,Trick! - 图10,取 Trick! - 图11%5Cgg%201#card=math&code=mid%20%3D%20%28l%2Br%29%5Cgg%201&id=Etb3q)
  2. 缩小范围时,Trick! - 图12,取Trick! - 图13%20%5Cgg%201#card=math&code=mid%20%3D%20%28l%2Br%2B1%29%20%5Cgg%201&id=fO7Sb)

第二种采取 Trick! - 图14%20%5Cgg%201#card=math&code=mid%20%3D%20%28l%2Br%2B1%29%20%5Cgg%201&id=whjhj) 的原因是当 Trick! - 图15 时,有 Trick! - 图16%5Cgg%201%20%3D%20l#card=math&code=mid%3D%28l%2Br%29%5Cgg%201%20%3D%20l&id=kpLCc),接下来若进入 Trick! - 图17 分支,则区间未缩小,造成死循环。若进入 Trick! - 图18 分支,造成 Trick! - 图19,循环不能以 Trick! - 图20 结束,因此对这两个形式采用配套的 Trick! - 图21 取法是必要的。

这里还要注意 Trick! - 图22Trick! - 图23 的区别,第一个是向下取整,第二个是向零取整。当 Trick! - 图24 中包含负数时,后者不能正常工作。

随机数

  1. mt19937 gen{random_device{}()};
  2. uniform_int_distribution<int> dis(0, n); // 产生 [0,n] 中的数字
  3. int x = dis(gen);