技巧篇
// 去重 + 排序
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());
set<int> s(a.begin(), a.end());
// 全排列
vector<int> p(n);
iota(p.begin(), p.end, 0);
do {
} while (next_permutation(p.begin(), p.end()));
// lower_bound 的用法
sort(a.begin(), a.end());
auto t = lower_bound(a.begin(), a.end(), x); // t 为大于等于 x 的第一个迭代器
if (t == a.end()) cout << "未找到满足条件的元素" << '\n';
else cout << t - a.begin() << '\n';
// 翻转字符串
string str = string(s.rbegin(), s.rend());
reverse(s.begin(), s.end());
// 回文字符串的判断
if (s == string(s.rbegin(), s.rend())) cout << "Yes" << '\n';
else cout << "No" << '\n';
// 不改变顺序的排序
vector<int> p(n);
iota(p.begin(), p.end(), 0);
sort(p.begin(), p.end(),
[&] (int i, int j) {
if (a[p[i]] == a[p[j]]) return i < j; // 加上这个可以保证稳定性
return a[p[i]] < a[p[j]];
});
// 二进制中 1 的个数
int a = __builtin_popcount(x); // unsigned int
int b = __builtin_popcountll(y); // unsigned long long
// 重载运算符
bool operator<(const Name& q) const {
if (a != q.a) return a < q.a;
if (b != q.b) return b < q.b;
return c < q.c;
}
// lambda 表达式实现递归
auto dfs(auto self, int u) -> void {
self (self, u + 1);
// return self(self, u + 1);
// == self(self, u + 1); return;
};
// 用函数关闭所有程序
exit(0);
// 堆 (优先队列)
poriority_queue<int> q; // 默认大根堆
poriority_queue<int, vector<int>, greater<int>> u; // 小根堆
// assign 重新分配容器内容
a.assign(n + 1, 0); // vector用法
// 容器中的最小值和最大值
int t = *min_element(a.begin(), a.end()); // 最小值
int s = *max_element(a.begin(), a.end()); // 最大值
数学篇
向量叉乘判断凹四边形
https://blog.csdn.net/minmindianzi/article/details/100056129