写码小技巧
map
map 想要把默认值赋为非0值怎么办?如果你能保证里面不会存0,那你可以写一个函数,在试图使用某个键值时,如果其为0那么当成你想要的另一个数。
内建函数
__builtin_mul_overflow(a,b,res) 可以判断 \(a\times b\) 是否会溢出,并把结果存在 res 里。
deque
避免使用 queue 和 deque,会产生巨大空间常数。(每个queue空的时候就自带约10倍空间常数)
list 16字节,pq 32字节,vector 24字节,deque 60字节?
bitset
可以快速查找某位后第一位1的方法,可用于优化模拟赛题:bs._Find_next(index)和bs._Find_first()。这是对应题目的提交记录,事实上是抄的一篇QOJ提交记录。
count 用于数 1 的个数
set
set 维护线段:见此片题解
随机数
获取精确到纳秒(往往受设备限制)的时间整数:chrono::system_clock::now().time_since_epoch().count()。
生成很好的整数伪随机数:先mt19937 rnd(seed),然后直接调用 rnd()
生成实数伪随机数:先uniform_real_distribution<double> urd(0,1) 然后调用 urd(rnd()) 即可。
可删堆
可用于替代 set,常数更小。
正常的堆不可删除,那么可以建立 \(2\) 个堆,一个表示增加叫A,一个表示删除叫B。增加时把元素放入A,删除时把元素放入B。如果A堆顶和B堆顶相等,则同时pop。正确性显然。

浙公网安备 33010602011771号