做题时遇见的,记录一下

数据范围与时间复杂度
\(n\leq 10^8\) \(O(n)\)
\(n\leq 10^6\) \(O(nlog\space n)\)
\(n \leq 10^5\) \(O(n\sqrt x)\)
\(n\leq 5000\) \(O(n^2)\)
\(n \leq 300\) \(O(n^3)\)
\(n \leq 25\) \(O(2^n)\)
\(n\leq 11\) \(O(n!)\)

优先队列在使用 \(top\) 访问堆顶元素前,需要判断队列是否为空。

lower_bound返回第一个不小于目标值的地址,upper_bound返回第一个大于目标值的地址
下标 = 返回值 - 数组名

int arr[] = {1,2,3,3,4,6,7,8};
	auto p = upper_bound(arr, arr + 8, 6), q = lower_bound(arr, arr + 8, 6);
	cout << *q << " " << *p << endl;//6 7

set.erase(x)会返回一个是否删除元素 x 的 bool 值

在涉及公共元素的朴素线性dp问题,对于dp_{i,j}的转移方程,似乎总是以 a[:i],b[:j]为转移状态,且似乎转移方程总在讨论 a_i 与 b_j 的相等问题

int 和 unsigned 类型比较的时候,int 会被强制转换为 unsigned 类型,在 int 类型数据为负数时,会产生反直觉的结果,所以比较时需要将 unsigned 类型强制转换为 int(具体原理与 int 类型与 unsigned 类型在计算机的储存方式(补码与反码)有关)。

	int n = -1;
	unsigned m = 2;
	cout << (n > m) << endl; // 打印true

有些背包问题,可以先分类在进行动态规划,比如AT_abc383_f [ABC383F] Diversity
只涉及单个集合的线性dp问题,\(f_i\) 一般是 \(i\) 为结尾的符合题目要求的值