\(: pow \ 函数的调用\)
pow 的 返回类型为浮点型 ,及时转换类型
//牛客练习赛111
cout << (10 - q[i]) * (int)pow(10 , i - 1) ;
$ : log2 \ 函数的调用$
建议使用 std::__lg() , 或者手动求
log2(x) , 当 x 趋近 long long 上限时 , log2(x)精度有问题 , log( (2^59) - 1 ) = 59
\(图\)
是手动存图时
for(int i = head[x] ; i ; i = nxt[i])
...
...
最好使用 i 变量 , 使用 k 变量容易冲突
\(全局与局部变量\)
int n,k;
void func(){
n , k //这里以为能调用全局变量 , 但会出现奇怪的错位
}
int main()
{
int n,k;
}
树
对于树上的 点 x , 组合成链的情况有 son[x] 与 `son[x] , son[x] 与 fa[x] 及其外部
计算问题
比如说 a * x -> b , a = a * a;
容易忽略 a 为 1 的情况
循环问题
CF div3 874
int j;
for(int i .. , j ..)
j++ ;
//这里我想利用 j 下标的连续性 , 于是在循环外设置 j , 但 j 是不满足才退出上一个循环 , 不用自加
for(int i .. , j ..)
并查集
CF div3 874
for(int i ..) {
// if(fa[i] == i) , 错了
if(find(i) == i) // 要注意有一些点并没路径压缩
}
//递归写法(优先使用)
return fa[x] == x ? x : fa[x] = find(fa[x]); //注意这里是 find(fa[x]);
//while写法
int rt = x;
while(fa[x] != x) x = fa[x];
return fa[rt] = x;
初始化
const int INF = 0x3f3f3f3f;
memset(f , -INF , sizeof f);
INF ; // 1061109567
f[0] ; // -1044266559 , 不是 -INF
线段树
void add(...) {
if(tr[rt].l == l && tr[rt].r == r) {
tr[rt].val += (tr[rt].r - tr[rt].l + 1) * val;
//容易下意识 tr[rt].val += val;
}
}
二分答案
// 二分st表
int l = i + 1 , r = n;
int mx = find(l ,r);
while(l < r) {
int mid = l + r >> 1;
//if(find(l , mid) == mx) r = mid; 错了
if(find(i + 1 , mid) == mx)
else l = mid + 1;
}
bfs
bfs 忘记 push 新状态
for 循环
for(1 ; 2 ; 3) {
4;
}
对于第一次循环 : 1 -> 2 -> 4 ->3
之后的循环 : 2 -> 4 -> 3
array
std::vector<std::array<int,4>> p(n , {0}); //把每一个 vector 中的每一个 array 里面的元素全部初始化为0
std::vector<std:array<int,4>> p(n , {INF}) //只有每一个 vector 的第一个 array 元素赋值为 INF
dfs
一类问题就是 dfs 的返回值是 bool , 全 true 为 true , 有 false 则成 false
一般在每一层有一个变量 flag 记录
std::function<bool(int)> dfs = [&] (int u) {
bool flag = true;
for (auto f : g[u]) {
int v = f.first , w = f.second;
if (col[v] == -1) {
col[v] = col[u] ^ w;
flag &= dfs(v); // 写成了dfs(v) , 应该是 flag &= dfs(v);
} else {
if (col[v] != (col[u] ^ w) ) {
flag = false;
}
}
}
return flag;
};
异或
写割边的时候
if (i != in_edge ^ 1) 错了
应该是 if (i != (in_edge ^ 1))
//2021 ICPC 沈阳 B
(a & b == 0) // 应该为 ( (a & b) == 0 )
字符串
std::string s1 , s2;
s1 = s2 ; //注意字符串的赋值是 o(n)
差分
差分数组一定用额外的数组存 , 易错
改值问题
之前放过在遍历 set 的过程中删除 set 值的错误
CF1842D
std::vector<bool> _del(n);
_del = del; //要单独开出 _del
for (int j = 0 ; j < m ; ++j) {
int u = E[j][0] , v = E[j][1];
if (del[u] != del[v]) {
E[j][2] -= cur;
if (E[j][2] == 0) {
_del[u] = _del[v] = true;
}
}
}
del = _del;
bool 函数返回值
实验了一下
bool check(int x) {
if (x == 1) return false;
//return true;
}
没有 "return true" , 对于 (x != 1) 默认返回的是 false
要清楚写好每一种情况的返回值