wtpavssite

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2026春季下学期第十周

周二:

初试线段树:

在O(logn)的时间复杂度下完成对区间的修改和查询,可以解决大区间的问题可以通过小区间合并处理得到的问题,但是没有这个性质就无法求出。

inline:

作用是建议编译器将一些函数直接内连到被调用的地方,相当于直接在被调用的地方复制了一份函数,常用在一些被频繁调用的很短的函数上面

周三:

线段树同时乘和加:

1.同时处理乘和加的时候需要两个tag数组来记录,而不是只有一个
2.处理儿子的乘和加的时候需要先乘再加,父节点的加法tag也需要乘上更新的值

线段树的动态开点:

周五:

Andrew算法:

首先明确凸点的概念,一个有限的点集,我们需要一个多边形将所有的点都包含在里面,使这个多边形的周长最小。那么我们先想象用一个橡皮筋扩大到能包含所有的点,然后松手,橡皮筋回弹,直接支撑橡皮筋的点就是凸点。Andrew算法就是将这些凸点给找出来。我们先将所有的点按照x从小到大(若x相等就按照y从小到大)排序,用一个单调栈来存入这些点,首先在栈里压入第一个点,然后当栈里有两个点以上的时候,下一个将被压入栈的点作为C点,栈顶的第一个点作为B点,栈顶的下一个作为A点,计算AB向量和AC向量的叉乘,根据计算的结果正负考虑是否将新的点压入栈。如果这个AC相对原来的AB向左旋转,那么这个B点一定是凹点,而不是凸点,就将B点出栈,重复上述步骤直到找到栈里一个新的B点可以做到AB相对AC向左旋转或者当栈里只剩下一个元素的时候。然而这个步骤我们需要进行两次,一次是上凸壳,从所有的点从1到n,一次从n到1算出下凸壳。需要注意的是左右凸壳并不是不存在而是找了一个点作为最凸的点将上凸壳和下凸壳连接起来了,而且找下凸壳的时候AB相对AC是向右旋转,而不是向左。

旋转卡壳:

找到了所有的凸点之后,我们需要找到凸点间最远的距离,那么我们能发现:在选定了一条边的情况下,对于他的最远点是唯一的,当我们沿着凸点的边逆时针旋转选择下一条边的时候,对应这条边的唯一的最远点一定也是相对之前的点逆时针旋转了的。那么我们发现只需要沿着一个方向枚举每条边,对于每条边找到对应的最远点,计算距离维护最大值即可。时间复杂度是O(n),由于最远点的不会往回走,所以最远点的编号一定是单调不减的。需要注意的是这里的最远点的距离计算是计算两个向量的叉乘,叉乘的几何意义就是这两个向量张成的三角形的面积,由于底是相同的,叉乘的值越大,对应的高越大,也就是距离越远。

posted on 2026-05-05 21:33  wt_pav  阅读(8)  评论(0)    收藏  举报