笔记
一.区间相关
- 区间和:前缀和
- 区间增减:差分+前缀和
- 单调区间:二分查找
- 区间可加:线段树
- 复杂区间操作:分块
- 数列中出现删除操作:链表
二.搜索相关
- 最优性剪枝:当前代价大于目前求得的最小代价
- 可行性剪枝:明显不符合题意,或估算最小代价,大于已求则返回(最优性)
- 优化搜索顺序:题目中明显指出(如用最少物品填满),进行排序后再搜索
- 不入流剪枝:能剪就剪,但是不能牺牲正确性,也不能效率太低,会得不偿失
- 广搜记得出队,v数组记录是否在队里,避免重复入队;深搜处理好边界,v数组记录是否访问过
三.输入输出
- long long、int
- 输入和输出使用printf和scanf是,记得让“%x”和变量类型匹配,不要前面是long long ,后面就成了 %d
- cin>>a 返回:a==EOF?0:1;
- scanf("%d",&a) 返回: a==EOF?-1:读入数的个数
四.STL
1.upper_bound&;lower_bound
-
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
-
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标
五.图论
- 有向图和无向图
六.其他
- 有多组数据时要记得清零
- 线段树开四倍空间
- unsigned long long [0,2^64-1],long long [-263,263-1],
- printf/scanf:
% | 变量类型/输出特点 |
---|---|
%lf | double |
%c | char |
%s | string,char[] |
%.4lf | 保留四位小数 |
%llu | unsigned long long |
%% | % |
- 线段树左子区间带等号,右子区间不带(l,mid)(mid+1,r)
- 线段树在修改、建树回溯之后记得维护性质
- 数组小心下标越界 a[-1]
- 满足运算结合律的,可以考虑倍增
- 262144个
int
是一MB (s-1)&S
可以枚举S的每个子集(2进制)