1 方差公式推导
s
2
=
Σ
x
i
2
n
−
x
ˉ
2
s^2=\frac{\Sigma x_i^2}{n}-\bar x^2
s2=nΣxi2−xˉ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'