1.在优先队列中,下面的写法堆顶是小的,但是如果是在排序中,那么就是从大到小排序
struct node {
int v,w;
node(int b, int c): v(b), w(c) {}
bool operator <(const node &a)const {
return w > a.w;
}
};
2.在写优先队列优化的最短路的时候,定义了如下函数
void dij(int num, int dis[]);
然后这时候,调用如下memset用法
memset(dis,0x3f,sizeof(dis));
就会发现编译器warning,事实上这样子也并没有成功赋值,要想赋值就得用for循环
这真的好奇怪!!!
3.关于位运算异或的小技巧
如果 a⨁b=c a ⨁ b = c .,那么就有 c⨁b=a,a⨁c=b c ⨁ b = a , a ⨁ c = b
4.右移和除2的区别
算术右移等于除以2向下取整,
(−3)>>1=−2,3>>1=1
(
−
3
)
>>
1
=
−
2
,
3
>>
1
=
1
;
但是,整数/2,在C++中实现为”除以2向0取整”,
−3/2=−1,3/2=1;
−
3
/
2
=
−
1
,
3
/
2
=
1
;
算术右移在二进制补码下高位以符号位填充,而逻辑右移高位以0填充.
5.补码负数与按位取反的联系
首先明确一点,一个数的补码就是正数按位取反+1,即
−n= n+1
−
n
=
n
+
1
,那么在lowbit的操作中,n& ( ~ n + 1 ) = n& ( - n )
n& ( ~ n + 1 ) = n& ( - n )
6.数学小技巧
∀k∈[0,35],2kmod37
∀
k
∈
[
0
,
35
]
,
2
k
m
o
d
37
互不相等,且恰好取遍整数
1−36
1
−
36
.