易错点

\(: 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
要清楚写好每一种情况的返回值


posted @ 2023-05-05 21:59  xqy2003  阅读(22)  评论(0)    收藏  举报