暑假学习日记2013/7/24
今天多校第一天,题目是北邮出的,听说比较难,一做果然发现,真的比较难...我们队三个人做出了4题,好吧,我一题都没敲到...一个代码都没写,但是也有一定的思路贡献,4题里有一题颇水吧,然后一题找规律,pz找的好快,然后就是一个快速幂的事了,然后是一题图论的,YY了很久,发现问题可以转化为求一颗树的直径,最后我想了一下dfs一下就可以了,然后还是pz打..orz,然后还有一道是和最长上升子序列的,我告诉了他们nlogn的算法的原理,然后他们想出来了怎么利用原理的变形求出来,反正我是没理解..慢慢消化一下吧.剩下的时间就在想一两道题,一道后来听说是线段树做的,但是怎么构造真不知道,所以就没办法,还有一道是给你一个数组,里面选3条边构成三角形的概率.这么简单易懂的题意但是实在想不出好方法..只有n^2logn的..后来看了题解知道是快速傅立叶变换实现多项式乘法,于是今晚恶补了一下一些相关知识.
FFT对多项式的乘法是nlogn.一般的乘法的时间复杂度是n^2,因为我们采用的是系数表达法,但是如果我们用的是点值法的话,乘法就是O(n)的了,FFT的方法是用一个nlogn的复杂度将系数转为点值(通过选取有着特殊性质的点),然后做O(n)的乘法,再然后O(nlogn)将点值转回来,从而实现nlogn的算法.(话说今天看了一下相关的知识,发现自己原来就已经推导出了拉格郎日插值法,颇有成就感.)FFT中选的点是2n次单位根..原理颇复杂..实现等我改日再实现一次吧..有了FFT的话,那题就可以在有限的时间里做出来了.
今晚不能太堕落,所以我还看了下强连通分量(scc)的一个算法(Kosaraju).做个小笔记吧.首先是每个点开始dfs,标记的是后序遍历的顺序.然后将原图的边反向,再在新图中按遍历的值的由大到小dfs.每一次dfs都会找出一个强连通分量.这里让人诧异的是,为什么是后序遍历,第二是为什么要将原图的边反向.我也不太懂.但感觉边反向是有意义的,因为原来的图中的强连通分量反向后仍然是强连通,当然算法的正确性的理解还是慢慢来的.还有SCC也有Tarjan算法,不过感觉貌似挺复杂的,慢慢学吧..
总结一下:
1.FFT(Fast Fourier Transoformation)的基本原理
2.SCC(Strong Connencted Component的Kosaraju算法