手动 O2 优化
#pragma GCC optimize(2)
关于二分
若 ,则根据序列
的单调性,
之前的数会更小,所以
的最大的数不可能在
之前,可行区间应缩小为右半段,因为
也可能是答案,故此时应该取
。同理,若
,取
观察可得:
- 缩小范围时,
,取
%5Cgg%201#card=math&code=mid%20%3D%20%28l%2Br%29%5Cgg%201&id=Etb3q)
- 缩小范围时,
,取
%20%5Cgg%201#card=math&code=mid%20%3D%20%28l%2Br%2B1%29%20%5Cgg%201&id=fO7Sb)
第二种采取 %20%5Cgg%201#card=math&code=mid%20%3D%20%28l%2Br%2B1%29%20%5Cgg%201&id=whjhj) 的原因是当
时,有
%5Cgg%201%20%3D%20l#card=math&code=mid%3D%28l%2Br%29%5Cgg%201%20%3D%20l&id=kpLCc),接下来若进入
分支,则区间未缩小,造成死循环。若进入
分支,造成
,循环不能以
结束,因此对这两个形式采用配套的
取法是必要的。
这里还要注意 和
的区别,第一个是向下取整,第二个是向零取整。当
中包含负数时,后者不能正常工作。
随机数
mt19937 gen{random_device{}()};uniform_int_distribution<int> dis(0, n); // 产生 [0,n] 中的数字int x = dis(gen);
