各种小知识点和易错点收集整理

1 方差公式推导
s 2 = Σ x i 2 n − x ˉ 2 s^2=\frac{\Sigma x_i^2}{n}-\bar x^2 s2=nΣxi2xˉ2

2 多重背包的二进制优化
由于选取的件数可以用若干个(1 << i),可以把m件物品按二进制拆成(1 << i)件,顺序拆(注意在这个。拆完之后就变成01背包了。
这样一拆解就变成了O(nmlogn),从n变成了logn,是非常好的优化(而且并不是很难理解)。
数组的大小是nlogn。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int w[100001],c[100001],b[100001],c1[100001],w1[100001];
int main(){
	int i,j,cnt = 0,n,m;
	long long dp[100001];
	scanf("%d %d",&n,&m);
	for(i = 1;i <= n;i++){
		scanf("%d %d %d",&c[i],&w[i],&b[i]);
		//if(!b[i]) b[i] = 1e6;
	}
	memset(dp,0,sizeof(dp));
	for(i = 1;i <= n;i++){
		for(j = 0;(1 << j) <= b[i];j++){
			c1[++cnt] = (1 << j) * c[i],w1[cnt] = (1 << j) * w[i];
			b[i] -= (1 << j);
		}
		if(b[i]) c1[++cnt] = b[i] * c[i],w1[cnt] = b[i] * w[i];
	}
	for(i = 1;i <= cnt;i++){
		for(j = m;j >= w1[i];j--){
			dp[j] = max(dp[j],dp[j - w1[i]] + c1[i]);
		}
	}
	printf("%lld",dp[m]);
	return 0;
}
/*
10 3
2 1 0
3 3 1
4 5 4
*/

3 记得看清楚更新的顺序。

4 ecnt = -1初始化多测别忘了(捂脸)

5 可以溢出的01背包(需要x,求最小花费y)从V到0遍历,因为有的选项直接会超出需要上限。

6 手动赋值代替memset

7 一些常用的位运算操作:
x & (1 << (i - 1)) != 0 查询第i位数是否为1
x = x | (1 << (i - 1)) 把右数第i位数修改为1
x & y 判断x和y状态是否有重合1(相邻位置的判断)
i & j == i 相当于j中为1的部分i中全为1(也可以说是j是i的子集)
i ^ (1 << j) i的(右数)第j位为0时,改成1

8 在二分问题中寻求字典序注意遍历顺序。

9 double类型初始化不能memset 0x3f或者63,可以用127代替。

10不管是线段树还是树状数组的模板都不支持0上树,所以在这种时候一定要把上树的内容++,以及这时候数组大小要改成x+2.

11只要是对队列等的操作,一定要判断是否为空,不然总会有一天RE。注意队首弹出之后队首已经变化了,所以往往弹出放在最后或者用变量存一下队首信息,否则会出现很难发现的逻辑错误。例如:

while(!R.empty() && R.top().first <= time){
	x = R.top().second;
	R.pop();
	if(mark[x] > time){
		R.push(make_pair(mark[x],x));
	}
	else Q.push(x);
}

13对于一些值域小而定义域大的问题,可以逆向思维,枚举取值寻找方案是否存在。同理,对于一些边很多而点少的问题,可以观察是否存在某种加边顺序维护使得一维由m变成n。

14在统计方案的时候,不能忽略掉不取这个部分的方案,即f[i] *= (f[j] + 1)。这常见于树形DP的转移当中。

15 链式前向星遍历边的顺序与存边顺序相反。

16不要忘记一般的除号是向0取整,所以在负数除法当中除号是上取整的。

17typedef pair<int,int> pr注意有的时候可能需要改成long long。

18 #define 不要忘记外边打括号

19 写代码的时候一定要注意别把===写串了。。。

20 SA/SAM取分隔符不要取同一种
这样取分隔符容易UB而重复:
s[++n] = n + 'z';

21 在随机数据下环套树上环的大小是对数级的

22 带修莫队在修改时一定要swap而不是赋值

23 树上莫队不要忘了块长分子是2n而不是n

24 对于有修改的问题,注意离散化的时候也要把修改操作离散化。

25 写IDA*记得从零开始

26 末尾一定要返回值!!!!!

27 splay的中序遍历是原序列
27 splay的中序遍历是原序列
27 splay的中序遍历是原序列

28 多测输出字符串注意清空字符串s[n+1] = '\0'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值