【数学】【计算几何】[POI2005] Dextrogyrate Camel 以及极角排序有关技巧
题目描述
给定平面上
这是一道计算几何题。
手模容易发现,如果你旋转的总角度超过了
我们假设
这样是
我们观察状态,发现同样是走过
下面假设 “前驱” 就是上文说的最优的前驱。
前驱具有一定的单调性:假设现在在
所以,我们可以利用这个二分。
设
然后对于
时间复杂度
现在具体讲一下如何以一个点为原点,一个点为零点极角排序。
首先我们将所有点的坐标减去
观察 atan2 函数的值,发现是这样的:
我们想要一个从
-
如果 atan2 为负数,则变成相反数。
-
否则变成
。
这样就得到了一个从
我们又想要它以
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
typedef long double ld;
const ld PI = 3.141592653589793239;
struct Point{
ld x,y,theta;
}a[N];
#define Vector Point
Vector operator -(Point p,Point q)
{
return Vector{q.x - p.x,q.y - p.y};
}
ld operator *(Vector p,Vector q)
{
return p.x * q.y - p.y * q.x;
}
ld getan(ld y,ld x)
{
ld ret = atan2(y,x);
if(ret < 0) ret = -ret;
else ret = 2 * PI - ret;
return ret;
}
inline bool onleft(Vector p,Vector q) // p on the left of q?
{
return (q * p >= 0);
}
int f[N][N],n;
int main()
{
cin>>n;
for(int i = 1;i <= n;i++) cin>>a[i].x>>a[i].y;
for(int i = 2;i <= n;i++) a[i].x -= a[1].x,a[i].y -= a[1].y;
a[1].x = a[1].y = 0.00;
for(int i = 2;i <= n;i++) a[i].theta = (getan(a[i].y,a[i].x) - getan(a[2].y,a[2].x));
for(int i = 3;i <= n;i++) if(a[i].theta < 0) a[i].theta += PI * 2;
sort(a + 3,a + n + 1,[&](Point p,Point q) {return p.theta < q.theta;});
for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++) f[i][j] = -1;
f[2][1] = 1;
int ans = 2;
for(int i = 3;i <= n;i++)
{
for(int j = 2;j < i;j++)
{
if(!onleft(a[i] - a[j],a[1] - a[j])) continue;
int l = 0,r = i - 2;
while(l < r)
{
int mid = (l + r + 1) >> 1;
if(f[j][mid] == -1) r = mid - 1;
else
{
if(onleft(a[j] - a[f[j][mid]],a[i] - a[j])) l = mid;
else r = mid - 1;
}
}
if(l == 0) continue;
if(f[i][l + 1] == -1) f[i][l + 1] = j;
else
{
if(onleft(a[i] - a[j],a[i] - a[f[i][l + 1]]))
f[i][l + 1] = j;
}
ans = max(ans,l + 1);
}
for(int j = i - 1;j >= 1;j--)
{
if(f[i][j] == -1) f[i][j] = f[i][j + 1];
else if(f[i][j + 1] != -1)
{
if(onleft(a[i] - a[f[i][j + 1]],a[i] - a[f[i][j]]))
f[i][j] = f[i][j + 1];
}
}
}
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!