因为是我这只蒟蒻个人的汇总嘛,可能有些奇♂怪的东西或者不规范的语言出现啦,见谅见谅
搬了一些到知识汇总里,删了一些过时和无用的,少了好多=。=
1.STL_queue
经实践验证,!qs.empty()快于qs.size()
2.luogu p2114 起床困难综合症
if(位运算) 括号++;
update on 2018.7.2:
发现位运算的优先级比小于号那一堆还低。。。
3.luogu p1853 投资的最大效益
当背包问题中代价/价值为$kn$时可以在循环中用$kn/k$来表示,这样可以压缩dp数组空间从而缩小常数
4.luogu p1284 三角形牧场
用计算函数时注意接受/返回的变量类型
5.二分答案(个人写法)
整数域上二分:1.卡死上下界 2.当合法时用变量记录答案 3.用$mid+/-1$移动左/右边界(用l<=r作为循环条件)
实数域上二分:1.卡死上下界 2.直接输出合法时的边界 3.用mid移动左右边界(用r-l>eps作为循环条件)
或者实数域二分看情况可以直接限定次数
6.luogu p1498 南蛮图腾
输出字符'\'时要写成'\\',因为'\'单独用是转义字符,'%'同理,它是输出时的标识符
7.luogu p1022 计算器的改良
float/double型的变量值为$0$时被负数除会变为$-0$,输出时注意判
8.long long
永恒的真理:不开long long见祖宗
9.STL
栈和队列取/弹元素时注意判断是否为空
10.luogu p2746 Networks of schools
缩点时注意判断图是强连通图的情况
11.竞赛图缩点
缩完了是条链
12.pow函数
cmath库里的pow函数就是个垃圾,永远都不要用
13.背包方案数
做这类问题时注意全都能买的情况下只有一种方案
14.luogu p3265 装备购买
有时精度误差可以通过拆开计算式的方式解决
15.左偏树
记得Gettop
16.CF474F Ant colony
线段树查询区间$gcd$时不能进入完全不包含的区间,不然返回什么都不是=。=
17.luogu p1867 钉子与小球
算术左移时注意爆int的问题
18.luogu p2233 公交车路线
调不出来的时候就回去仔细读题
19.luogu p2197 单选错位
当范围达到$1e7$的时候就该注意内存限制了
20.调试语句
一定要记得删!!!
21.SCC
Tarjan缩点后建新图后一定要区分好新旧图
22.luogu p1365 WJMZBMR打osu!/Easy
读入字符尽量读字符串后取出来,因为有换行符这个东西。。。
23.luogu p3498 Beads
挂链哈希表用新模数区分哈希值时注意和哈希表的模数区分开
24.边界问题
不要含糊,一定搞清楚,不然说卡死你就卡死你。。。
25.期望
对于OSU类问题(雾,详见洛谷p1654 osu),如果用滚动数组/变量统计答案,注意答案自己是这样的(以将除法转化为模意义下乘逆元为例)
$exp_{ans}+=(exp_1*k_1+exp_2*k_2+...+exp_n*k_n)\%mod$
26.差分约束
可以不要超级源点,将每个点手动入队+手动赋值
27.序列问题的一个套路
统计某种性质的区间时可以维护某个值然后一路扫过去,当这个值出现两次时说明中间这一段有某种性质
28.一个奇怪的东西
①$log_ca^b=blog_ca$ ②$log_ab=\frac{log_cb}{log_ab}$(文化课太差,捂脸
29.均摊复杂度
①当一个暴力的复杂度是$m$,另一个暴力的复杂度是$n/m$时,我们可以把它们拼起来,就得到了一个$nsqrt(n)$的解
②当算法的两部分复杂度相差很大时,尝试通过某种手段把复杂度均摊
30.最短路状态爆炸
分层/拆点
31.一个找规律的套路
尝试把下标放在分子/分母上
32.manacher
correct:r[i]=(maxr>=i)?min(r[2*mid-i],maxr-i+1):1;
wrong:r[i]=(maxr>=i)?min(r[2*mid-i],maxr-1+1):1;
不知道为什么我总是写成底下那个(捂脸
33.一个图上问题的套路
求以某个点为起点的某些信息可以考虑拓扑排序,求以某个点为终点/经过某个点的某些信息可以考虑记忆化搜索
34.当你因为限制太多被卡死时
不妨试试枚举吧=。=
35.一个合并区间信息的套路
正反都做一遍,然后前后拼起来
36.一个可行性dp的套路
套上bitset立刻获得$\frac{1}{32}$常数!
37.一个当你会设状态而不太会DP的时候的做法
直接记忆化搜索,非常有用
38.当你对一个题的策略不太确定时
不妨牺牲一些常数和可读性而写得更严密一些
39.Tarjan_CV
一个点可能会在好几个儿子被算成割点,需要打标记记录(建议)或者去重'
40.vector定点插入
举例:在vector<int> ve第$k$个元素之后插入元素$x$: ve.insert(ve.begin()+k,x);
41.不开O2时vector极慢
rt,慎用
42.莫队
加入是++x/--x,删除是x++/x--
43.一个bitset $bset$在$O(\frac{len}{32})$内查询是否能凑出某个数$x$
方法是从尾到头再维护一个反着的bitset $rset$
作差:$bset\&(bset<<x)$
求和:$bset\&(rset>>(Maxn-x))$,其中$Maxn$表示最大的数
44.叉积判斜率大小
斜率小的叉斜率大的得负,反之亦然
45.数论题经常挂的地方
爆int/long long
46.不要上头
在尝试翻译一份指针版FHQ_Treap写的LCT一晚上失败后得出的教训
47.LCT
Getroot之后要记得Splay
48.该传参传参,别老开全局
于2018.12.19上午调了两个小时后得出的教训
49.快读快输一场空,不判负数见祖宗
考试爆一道题得出的教训
50.暴力与优化
拿不准的时候,先把暴力写出来再优化
51.大概是背包的问题
可以考虑转成桶存储之后用多项式卷积优化
52.组合数记得判n<m
调了一个多小时这个=。=?
53.长代码要分块写
就是每块搞一个函数这样
54.输出保留若干位小数
一般需要你强制输出到应有的位数
55.FFT
乘的时候是两个复数相乘,别不知道怎么写成两个x相乘(不应该是手顺啊,明明代码更多了)
我居然调这个调了两个小时(其实是因为样例的写错和写对的答案太像了,我以为哪里丢精度了
56.图同构的一个套路
先把图看成完全图,然后把有/无边看做黑白染色
57.static
意思是静态内存,只有第一次赋值,以后都还用这一块,默认是之前的值
58.lyd快速乘
1 long long bmul(long long a,long long b,long long m) 2 { 3 long long tmp=((long double)a/m*b+1e-7); 4 long long ret=a*b-tmp*m; 5 return ret<0?ret+m:ret; 6 }
59.一个标记操作
异或一个随机值
60.权值线段树
要用右移操作取mid,因为当l=-1,r=0时,(l+r)/2=-1/2=0,而右移的话-1右移完还是-1,这样才不会无限递归下去
61.关于C++的模运算(?)
在C++中,模运算结果的符号和被除数的符号一致
62.树形DP联通块
一般做的时候后是默认强制选根的
63.调试
可以不断删优化,经常的情况是优化挂了=。=
64.一种构造题
要你去叉人的那种构造题一定要限制一个条件,使得在这个条件下能推出要叉的代码的式子
65.感觉不可做的问题不要扔
离线/莫队/差分/统计贡献/分块/记搜/容斥/二分/枚举/随机化/倒着做/启发式合并/拆解问题 一下,也许还能抢救
66.决策单调性
决策单调性并不代表代价函数是凸的或者递增的
67.计数DP的一个套路
枚举某个属性最大是几,然后处理缩小一级的问题,可以保证不重复计数
68.树上统计的一个套路
联通块大小的乘积可以转化为从每块中选一个点的方案数
69.权值线段树
注意是不是该开long long
70.线段树
如果是奇怪操作一定要考虑加上限制的暴力是不是就是对的
71.统计贡献
如果状态可以步步变化,可以考虑组合数
72.瞪眼
当状态维数较高的时候可以先固定几维再打表
73.unordered_map
注意它的内部是哈希表实现的,所以空间比map要大
74.priority_queue
定义了比较函数也不能直接在外面改影响比较函数的变量,不然堆会乱
(当然可以把跟更改的变量有关的全删了重新插)
75.线段树下放标记
记得取地址,wsl
76.推递推式的时候
可以尝试使用高中数学知识(雾
77.组合数
注意超过模数时上Lucas定理
78.一个套路
答案与顺序无关
79.LCT求LCA
Access(x)再Access(y),最后一个点就是lca
80.计数去重的套路
钦定和第一个部分有关的信息
81.NTT
对一个数组不断NTT会有一些神奇的现象发生
82.多项式卷积的一个思路
可以尝试寻找子结构
83.map
只要访问过就能count到
84.树状数组
可以反着维护后缀和
85.多项式求逆和开根
注意清数组,用清数组,还有Prework的大小
86.动态DP
写的时候注意分清=和+=
inf.原来有的,考完NOIP2018删了,我真tm是能毒奶
NOIP2018考了三道原题(原来大意是提醒自己要注重思考,然后我***奶了一句“正式考试不可能考原题”)