写码小技巧

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。正确性显然。

posted @ 2025-02-02 21:08  Luke_li  阅读(20)  评论(0)    收藏  举报