自定义比较的priority_queue
auto cmp = [](const vector<int> &a, const vector<int> &b) {
return a[0] < b[0]; // priority_queue用less是最大堆
};
priority_queue<vector<int>, vector<vector<int>>, decltype(cmp)> taken(cmp);
另:用multiset作为可支持删除的优先队列
二分搜索函数lower_bound(t)找第一个>=t的位置
// nums中找第一个>=t的位置
auto it = lower_bound(nums.begin(), nums.end(), t);
// 第一个<=t的位置
auto it = upper_bound(nums.begin(), nums.end(), t); // >t的位置
prev(it, 1); // 回退一位,就是<=t的位置
随机数
构造函数中:srand(time(NULL));
使用时:rand() % 10 // 生成[0..9]
自定义比较的set
struct Cmp {
bool operator()(const Interval &a, const Interval &b) {
// 若有插入操作,st的比较函数一定要写全各子段,否则插入只根据部分子段就判重
return a.start < b.start || (a.start == b.start && a.end < b.end);
}
};
set<Interval, Cmp> st;
或者比较函数写在Interval结构中
struct Inteval {
int start, end;
bool operator<(const Interval &rhs) const {
...
}
};
set<Interval> st;
第k小的数
// k是1-based,midptr要加上k-1偏移
auto midptr = nums.begin() + (k-1);
nth_element(nums.begin(), midptr, nums.end());
int median = *midptr;
// 中位数是第(n+1)/2小的数
auto midptr = nums.begin() + (n-1)/2; // (n+1)/2-1=(n-1)/2
// 如果是找第k大的数
nth_element(nums.begin(), midptr, nums.end(), greater<int>());
前k个数排序
partial_sort(A.begin(), A.begin() + K, A.end());
bitset
bitset<10>(h << 6 | m).count()
取绝对值
long x = labs(INT_MIN); // abs(INT_MIN)==INT_MIN,因为溢出
unsigned数中比特1的个数
__builtin_popcount(a)
进制转换
stoi(ab, NULL, 16)