多少沾点健忘症导致的
题目收集
并查集
在类似于“朋友的朋友是朋友,敌人的敌人是朋友”的题目中,我们考虑并查集。
我们可以利用反集来更加优雅的实现“敌人的敌人是朋友”。
将原长为 \(n\) 的数组开到 \(2n\)。
如果 \(a\) 和 \(b\) 是敌人,合并 \(n+b\) 和 \(a\) ,\(n+a\) 和 \(b\);如果 \(c\) 和 \(a\) 是敌人,合并 \(n+c\) 和 \(a\) ,\(n+a\) 和 \(c\)。
注意顺序不可更改,传参必须先 \(n+...\) 再 \(非...\),即:
//若 x 与 y 为敌人
merge(x + n, y);
merge(y + n, x);
通过这样的操作,我们发现 \(b\) 与 \(c\) 合并到了一起。
string int 简单互换
//int -> string
int a = 114;
string str = to_string(a);
cout << a << '\n';
//string -> int
string b = "1919810";
int i = atoi(b.c_str());
cout << i << '\n';
STL
取模
\(a\ mod\ p\) 最好写成 \((a + p)\ mod\ p\)
预开空间vector易错
在提前预开空间的 vector 中,使用 lower_bound() 应注意写成 lower_bound(p.begin() + 1, p.begin() + 1 + n, x) 而不是 lower_bound(p.begin(), p.end(), x)。
同时也需要注意判断是否找到元素应该是 it == p.begin() + 1 + n 而不是 it == p.end()。
前缀和判断区间和整除
前缀和,\(s[i]\) 表示 \([1,i]\) 的和, \([l,r]\) 的和就可以拆成 \(s[r]−s[l−1]\),当 \(s[r]\) 和 \(s[l−1]\) 模 \(7\) 相同时,区间就能被 \(7\) 整除
DFS
记得把第一个状态的 vis 设为 1!

浙公网安备 33010602011771号