hihocoder1582(凸包)2017北京网赛

好久没写凸包,忘记了很多细节,导致赛场没做出来。

题意,给出一些坐标点,任务是把这些点分成A类和B类,使得无法用一条直线分隔开这些点,输出YES即每个点放在A类还是B类(任意分)。如果做不到,就printf(“NO\n”);


对于大于三个点时,跑一遍凸包。

如果凸包点个数==n;说明所有点都在凸包边上,选择两个不相邻的点归为一类即可。

如果凸包点个数


n==3是特判是不是直线。

n<3时全NO



#include
using namespace std;
typedef long long ll;
typedef pair P;
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define clr(x,y) memset(x,y,sizeof x)
#define PI acos(-1.0)
#define ITER set::iterator
const ll Mod = 1e9 + 7;
const int maxn = 1000 + 10;

int n;
struct Node
{
    double x,y;
    int pos;
    double val;
}a[maxn];
Node s;
double d2(Node x,Node y)
{
    return (x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y);
}
double get(Node x,Node y)
{
    return (x.x - y.x) / sqrt(d2(x,y));
}
bool cmp(Node x,Node y)
{
    if(x.val == y.val)return d2(x,s) < d2(y,s);
    return x.val > y.val;
}
bool is_(Node x,Node y,Node z)
{
    return (x.x - z.x) * (y.y - z.y) == (y.x - z.x) * (x.y - z.y);
}
char ans[maxn];
double across(Node x,Node y,Node z)
{
    return (x.x - y.x) * (z.y - y.y) - (x.y - y.y) * (z.x - y.x);
}
bool vis[maxn];
void solve()
{
    for(int i = 1;i <= n;i ++)if(a[i].x == s.x && a[i].y == s.y)a[i].val = 1;else a[i].val = get(a[i],s);
    sort(a + 1,a + n + 1,cmp);
//    cout << s.x << " " << s.y << endl;
//    for(int i = 1; i <= n;i ++)cout << a[i].x << " " << a[i].y << " " << a[i].val <




你可能感兴趣的:(计算几何)