先上图
传统的Graham 扫描法
先排序,从左到右,从下到上
做两边,分别做上半部分和下半部分
用栈维护点,发现是凹的就退栈,但起点不能弹掉(WA了好久)
三点方向可用叉积判断
每一遍做完后栈中剩下的元素就是凸包的顶点
[NOIP2017]逛公园
当年天真的我以为最短路图是有环的,然后翻了车
首先跑一遍的最短路,记为
用记录点,距离的方案数
转移方程如下
这里的是反图上的边
答案就是,初始化所有为1
对于0 环,比较好的一种处理方式是记忆优化搜索
当处理时,再次搜到,则说明图中存在0 环
[NOI2001]炮兵阵地
先预处理出一行内所有可行方案,记为,可以发现可行解并不多
再预处理出所有可行方案的炮兵数目,记为
用记录前行,且上一行状态为,上两行状态为的最大炮兵数目
转移时需要判断状态之间是否合法,炮兵是否均在平原
[SDOI2013]直径
首先求一遍直径,记起点为,终点为
所有可行边均在直径上(废话)
考虑直径上某个点,求出它不经过直径的能访问的最远距离,记为
复杂度显然是的
从到,依次遍历直径上所有点
- 若,则到之间所有的边均不是必须经过的
- 若,则到之间所有的边均不是必须经过的
需要注意的是,有些算法在遇到第二种情况时需要及时退出