易错点小结
零.整体把握(基本语法)
1.初始化函数别忘了打
2.占位符和变量类型不一样时,可能会出现乱码
3.
1
<
<
32
l
l
1 << 32ll
1<<32ll 会溢出,
1
l
l
<
<
32
1ll << 32
1ll<<32 才不会溢出
4.打少的通常是 exit(0) 之类的比较少用的函数的头文件(血的教训)
5.内存计算(K) :数组大小 * 类型大小 / 8 / 1024
6.宏定义和函数有差别,函数传参如果是式子,则会先计算出式子结果再传入,而宏定义却是直接替代掉了。
7.负数 / x 的时候是向 0 取整而非向下取整
8.浮点数有误差
e
.
g
.
0.01
∗
3
=
0.029999999...
e.g.~0.01 * 3 = 0.029999999...
e.g. 0.01∗3=0.029999999...
9.然而
d
o
u
b
l
e
double
double 强转
i
n
t
int
int 是向
0
0
0 舍入而不是向下。
10.printf ("%.5f",0);
≠
\neq
= printf (“0.00000”);
11.Push_Down() 里面要写 if (!p) return;
一.dp
1.树型dp
背包树形
d
p
dp
dp 第二维一定要从小到大枚举(
k
=
0
k = 0
k=0 时
j
=
j
−
k
j = j - k
j=j−k)
即:
C
h
a
n
g
e
(
d
p
[
u
]
[
j
]
,
d
p
[
u
]
[
j
−
k
]
+
d
p
[
v
]
[
k
]
)
(
k
=
0
)
Change (dp[u][j],dp[u][j - k] + dp[v][k])~ (k = 0)
Change(dp[u][j],dp[u][j−k]+dp[v][k]) (k=0)
如果从大到小枚举
d
p
[
u
]
[
j
−
k
]
dp[u][j - k]
dp[u][j−k] 的值就被更新过了
二.图论
1.最短路
① Floyd
F
l
o
y
d
Floyd
Floyd 第一维为
k
k
k
F
l
o
y
d
Floyd
Floyd 记得去重边
2.网络流
①最大流
②最小割
最小割的概念:在有向图上,分出两个点集 S , T S, T S,T, ∣ f ∣ = ∑ s ∈ S , t ∈ T c [ s ] [ t ] |f| = \sum_{s \in S, t \in T} c[s][t] ∣f∣=∑s∈S,t∈Tc[s][t] (注意是有向图,且边权算的是容量)
三.数据结构
当每个点的答案都是对的,但区间的答案是错误的时候,不一定是 P u s h U p PushUp PushUp 写错了,也有可能是 P u s h D o w n PushDown PushDown 写错了。
1.RMQ
Q u e r y Query Query 时记得加一 ( f [ r − ( 1 < < k ) + 1 ] [ k ] f[r - (1 << k) + 1][k] f[r−(1<<k)+1][k])
2.平衡树
①. fhq treap
R
a
n
k
S
p
l
i
t
RankSplit
RankSplit 时注意等号
②. 旋转 treap
f i x fix fix 值记得取模,不同系统 r a n d ( ) rand () rand() 的范围不一样
3.树链剖分
树链剖分向上跳时的条件写成了 dep(深度),应该是 dfn(时间戳)。
4.线段树
线段树的查询区间出现 r < l r < l r<l 的情况
解决方案:
- 在 4 4 4 倍空间的基础上再开大 2 2 2 倍
- 判断 r < l r < l r<l
四. 基本算法
1.分块(莫队)
分块 T T T 了 Q A Q QAQ QAQ:①: S i z e Size Size 没选好 ②:计算 S i z e Size Size 的时候溢出了