计算几何方面:
ccpc网赛 1009 用到了之前学习的圆的反演的内容
同时和两圆相切 可以转换成反演之后和两条平行直线相切
所以反演之后圆的位置很好求 而且反演之后每个圆的半径相同
推推公式可以O(1)得到原来圆的大小
由于精度要求较小 只有1e-5 可以剪枝
如果当前项乘上后面剩余项数也不够eps就可以跳出了
= =公式一个地方少乘个4 T一次WA一次。。。
HDU 3228
给出两条直线上的一些点,求一个最小生成树 n <= 20000
直接做n^2条边肯定不行, 想一下对于一条直线上的某一个点 在当前直线上只会和相邻的点相连
对于另一条直线只会和投影点附近的点相连 这样有效的边的规模是O(n)的就可以搞了
注意二分找投影点附近点的时候 会有垂直于x轴的数据 可以直接用点找 或者x,y坐标看情况二分= =
当时没考虑这种情况
UVALive 4499
给你一个矩形 矩形内有一些点 和 一个圆 保证点都在圆外
现在你可以在矩形内任取一点(不能在圆内) 这个点可以看到其他点 当且仅当该点和其他点的连线线段 不和圆相交
问最多能看到几个点
好题 之前做过利用点或者圆极角排序处理一些问题的题目
这里发现点和圆似乎都不太好搞
其实题目中的矩形不只是限制了一个坐标范围 也是一种工具 为了使看的角度更大 肯定考虑贴着矩形边缘找点
对于每个点 我们求出它和圆的切线(射线) 切线与矩形相交 会覆盖一段区间 这段区间是看不到点的 其余部分都是合法的
然后就很明显了 求矩形边界合法区间覆盖次数的最大值
自己写的时候写丑了 能过但是长又慢 我把矩形的四边拆开来做 每段会有插入删除 这样讨论的情况就多了 很麻烦
看了下别人的写法 其实只要找出那两个交点就行了 从矩形的一点按顺序枚举 有的时候需要在起始时就加上 因为它已经出现了
UVALive 2395
pick定理 复习一下 s = a + b / 2 - 1 s是多边形面积 b是边界上的点数 a是多边形内部的点数
其实b就是每条边向量的gcd之和了
这道题有个坑点就是 他给出的并不是顶点 可能出现多点共线的情况 计算b不会出现问题
就是求最初的origin的时候会出错
POJ 3747
大概就是说一个圆形的区域 你从某一固定点开始跑 一些点会有炸弹爆炸 范围随着时间增加
爆炸范围扩大的速度和你跑的速度一样大 能跑到圆的边界就算逃脱成功 问你可不可以成功逃脱
感觉也很好 刚开始想的是 肯定是沿着直线跑 转换为一个圆和其他半径相等的圆的交 在那个圆上求出所有的交点 极角排序搞一搞
看了fhq大爷的题解 感觉他的解法更清晰 假如只有一个炸弹的话 我跑的可行范围肯定是和炸弹连线中垂线的一侧
这条中垂线会把圆划分成两部分 一部分是合法的 一部分是非法的 所以多个炸弹 就相当于这些叠加 所以求找有没有一段对所有炸弹
都合法的区间就行了 有点类似半平面交 但其实最后的可行区域只有一些圆弧 而不是多边形
然而数据范围很小 直接均匀多个枚举跑出去的位置 判断是否合法就行了
poj 3336
预处理之后 就是判断连通性的问题 并查集就行了
但是写着确实麻烦 关键是读错了题 改了很多次 比如最后一次才发现地铁是线段不是直线= =
自己的写法是 m ^ 2 * n * log m的 跑了将近1s 是别人的好几倍吧 。。。
cf的话
那场div1的B 当时很naive 写了bfs来求解
这样并不能保证一定找到解
其实想一想的话 phx刚开始就说出了很重要的一点
有-1的话 一定有解 因为-1相当于相当于调节他相邻点状态 而自己始终合法 那其实和-1直接相连的也可以视为-1 然后就一定有解了
所以如果有-1的话 我们随便找一个-1的点当根dfs一下 相当于一棵树
当前节点的状态由他的孩子们确定 再由该状态 确定连向他的父亲那条边是否选择
由于根是-1 一定可以搞出来
无解的情况想一下 只有奇数个1而且没有-1的情况
这个时候就随便找个点dfs 类似做法 最后看根的状态对不对就行了