学习了极角排序的一些套路
UVA11696
给你一些圆和一些点,保证点不在圆内,两点相连通当且仅当两点联结的线段不与任何一个圆相交,问联通块个数
跟之前那道UVA很类似 其实更加简单
枚举每个点 把其他所有点和圆对他极角排序 用set维护圆到当前点的切线的最短距离 因为点不在圆内 所以直接判断距离就行了
poj 2280
给你一些A类点 B类点 寻找一条直线 使得线上的点和直线左侧的A类点 直线右侧的B类点数目之和最大
首先可以知道直线一定从 给定两点的连线中产生
所以考虑枚举点 让其他点对他极角排序
一种巧妙的做法是 把B类点都映射到关于枚举点的对称点 相当于只统计直线上和左侧的点的数目
这样枚举每边,寻找夹角为pi内的点的数目 是单调的
UVALive 4064
给你一些点 问你锐角三角形的数目
锐角三角形不好统计 但是直角和钝角三角形好统计
所以C(n,3) 减去两个的数目即可
统计和上题类似
统计pi/2 pi的角的个数
UVA11704
平面上一些A类点B类点
问存不存在一条直线 使得两侧的A和B类点数目相同
还是和上面类似 更简单了 看是不是2倍关系就行
其他的题:
codeforces div1 421B
给你一个排列 定义_sum = sum of |p[i] - i|
你可以平移这个序列 (每次把最后拿到最前) 问最小_sum
刚开始可以统计出答案 记录 p[i] <= i的数目R 和其余的数目L
每次平移相当于答案减去L加上R 最后元素的贡献单独考虑
预处理出每个点的变化时刻 会对L,R产生影响
多校4 1005
相当于你每次可以从集合里加一个数 (这个数有依赖关系) 问你大于等于K的最小答案是多少
模意义下的最短路, 考虑其中的一个元素a,假如tmp可以达到,那么tmp + k * a都可以达到
我们相当于求出所有可行的tmp去更新答案 这样的tmp只有a个
对于这道题就是把a设为2*min(g[1][2], g[2][3]) 因为我们可以来回走这条边来刷距离
相当于 4 * a个点的最短路 假如当前到达2点的距离为dis 可以用 ((k - dis - 1) / a + 1) * a + dis 更新答案
感觉自己最近的状态很有问题 很多代码都会出bug 出一些不该出的问题
必须要杜绝这种失误 调整状态 明天看看扫描线