几何题有时会要求我们对坐标系中的点进行旋转,给出角度,或者以某一条直线为新的坐标轴。
对旋转问题,我们可以用三角函数等解决,但是精度问题难以解决。
学习了解析几何部分知识以后,我想到了一种能避免出现小数的方法。
例:给出一条直线和一些点的坐标。问该直线是否这些点的对称轴。
分析:以该直线为x'轴,以其某条垂线为y'轴,将所有点的新坐标求出来,再用哈希判断即可。关键是坐标转换。
已知两个点,如何确定过这两个点的直线?
设直线为Ax+By+C=0,两点分别为(x0,y0),(x1,y1)。
则有:Ax0+By0+C=0 …… ①
Ax1+By1+C=0 …… ②
①-②得 (x0-x1)A + (y0-y1)B = 0
令A = y0-y1,B = x1-x0则可满足条件,此时代
“在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。
树链,就是树上的路径。剖分,就是把路径分类为重链和轻链。
记siz[v]表示以v为根的子树的节点数,dep[v]表示v的深度(根深度为1),top[v]表示v所在的重链的顶端节点,fa[v]表示v的父亲,son[v]表示与v在同一重链上的v的儿子节点(姑且称为重儿子),w[v]表示v与其父亲节点的连边(姑且称为v的父边)在线段树中的位置。只要把这些东西求出来,就能用logn的时间完成原问题中的操作。
重儿子:siz[u]为v的子节点中siz值最大的,那么u就是v的重儿子。
轻儿子:v的其它子节点。