多少沾点健忘症导致的

题目收集

做题笔记

并查集

在类似于“朋友的朋友是朋友,敌人的敌人是朋友”的题目中,我们考虑并查集。

我们可以利用反集来更加优雅的实现“敌人的敌人是朋友”。

将原长为 \(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

OI_Wiki_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!

posted @ 2024-04-27 21:18  QianXiquq  阅读(47)  评论(0)    收藏  举报