导语
经过了寒假集训12天的学习与2次考试的摧残,我们结束了编程的寒假集训~~~
总的来说,还是有那么一些收获的,但是似乎比较凌乱,所以自己来总结,分类
知识点概括
分析
首先年前讲了两个较重要的知识点:
树的LCA && 树形DP
对我来说,LCA稍微掌握的好一点,而树形DP要用到DP,学地并不是很清楚,明白(至少比起宏帆的某些同学来说)
首先是树的LCA
意思就是求两个树上点的最近的公共祖先,我们选择一种最常用的倍增法:
也就是一步步向上跳,直到跳到LC
把整棵树建好后,我们每次向上跳步,用DP的方法实现:
/*
f[i][j]表示第i个节点向上跳2的j次方层后到达的节点,然后初始化就有f[i][0] = fa[i](它的父亲)
状态转移为:f[i][j] = f[f[i][j-1][j-1] 先跳2的j-1次方,再跳2的j-1次方
*/
for( int j = 1 ; j <= 30; j ++ )//这一层枚举j
for( int i = 0 ; i < n ; i ++ )
f[i][j] = f[f[i][j-1]][j-1];
这也是倍增的重要代码,接着我们在跳的时候就不用一步步了,直接2的j次方跳,如:
void jump( int &x , int mu ){
for( int i = 30 ; i >= 0 ; i -- ){
if( high[f[x][i]] >= mu )
x = f[x][i];
}
}
int LCA( int x , int y ){
if( high[x] > high[y] )//先把两个点放在同一高度,这样方便一起跳
jump( x , high[y] ) ;
else if( high[x] < high[y] )
jump( y , high[x] );
if( x == y )//如果跳到同一层后LCA就是y或x,直接输出
return x;
for( int i = 30 ; i >= 0 ; i -- ){//我们从大到小
if( f[x][i] != f[y][i] )//如果两个点跳到不相同的地方我们就跳,因为LCA上面肯定是相同的
x = f[x][i] , y = f[y][i];
}
return f[x][0];
}
数形dp
请看例题: computers
年后的数论:
(只要花大量时间弄懂,其实并不是很难)
知识点有些杂,以后遇到某类题的时候再细细讲一遍,先看:
求组合数的各种方法 , 同时这里还有求逆元的方法
毕竟是总结,就不要抽全部来讲,主要是谈谈自己的收获
考试 && 总结 && 目标
第一次考试还是不错的,至少没有差很多,但是到了第二次考试的时候,数论是自己新学的,当时掌握得并不是很熟练,所以几乎算是考炸了~~~还差点爆0,自己的学习能力和总结能力还有很大提高的空间,争取在面对新知识点时能够在课堂上就可以消化,这也是对自己的一个要求。
自己依然要延续对编程学习的热情,同时我也要消化寒假的所有知识(当然,时间可能会要有些久),同时,还要顾及好文化课的成绩(特别是数学)
这学期目标:
1.能够在课堂上消化老师所讲的知识
2.加强DP能力,能够很快看出转移方程
3.将数论所讲知识理解且应用
4.文化课成绩也一定不能掉(特别是数学)
5.考进至少一次前5(努力努力)
另外,还有这些尚未掌握:
1.CRT && 拓展CRT
2.拉格朗日插值
3.高斯消元
还有树形dp的很多题。。。。