开始复习,把u盘现存和noip历年题速刷,写题解,总结套路。以下总结考试经验,解题套路,思维套路
- 矩阵乘法,高精度等之类的结构体重载运算符的变量要用const type &x
inline matrix operator * (const matrix &x,const matrix &y) {
matrix c;
c.n = x.n;
c.m = y.m;
rep(k, 1, x.m)
rep(i, 1, c.n)
rep(j, 1, c.m)
c.a[i][j] = (c.a[i][j] + 1ll * x.a[i][k] * y.a[k][j] % mod) % mod;
return c;
}
c是定义在函数里面的矩阵,有个数组,记得初始化!
循环KIJ更快,访问连续内存
3. 01字典树取出x的第j位要这样写 (x>>i)&1
,不能写成((x&(1<<i))>>i)
,会爆int
4.一定要多多面向部分分编程
5.像map,set这种不支持随机访问的不要用lower_bound(s.begin(),s.end(),x),这样是暴力的。。 要用 s.lower_bound(x);
6.int向上取整要这样写
if (temp%k == 0)
result = temp / k ;
else
result = (temp / k)+1;
7.不开longlong见祖宗
8.
for(int i = head[u]; i; i = nxt[i]) {
if(to[i] == fa)continue;
dfs(to[i], u);
sz[u] += sz[to[i]];
for(int j = sz[u]; j >= 0; j--) {
for(int k = 1; k <= min(j, sz[to[i]]); k++) {
dp[u][j] = max(dp[u][j], dp[u][j - k] + dp[to[i]][k]);
}
}
}
这样计算会大量重复计算,遇到链会卡成三方,下面那种保证点对都在LCA处计算,保证时间复杂度为而二方
for(int i = head[u]; i; i = nxt[i]) {
if(to[i] == fa)continue;
dfs(to[i], u);
for(int j = sz[u]; j >= 0; j--) {
for(int k = 1; k <= sz[to[i]]; k++) {
dp[u][j + k] = max(dp[u][j + k], dp[u][j] + dp[to[i]][k]);
}
}
sz[u] += sz[to[i]];
}
9.板子一定要熟,特别是数据结构,不能打错,慢慢打。tarjan的板子(dfn,low,各种要求的(割点割边等)的判定方法)!
10.函数前面一定要有定义类型,非void函数一定要有返回值,等于号不要打成赋值号
11.注意看警告!
12.如果题目有个操作,让你对个数字进行操作,次数很大,上1e9的,多半是倍增,矩阵快速幂
13.边权都是1/0的可以用双端队列bfs O(n)求最短路,1的放后面。0的放前面