sgu-253 Theodore Roosevelt

题目大意:

给你一个N(N<=105)个点的凸包,给你M(M<=105)个点,要你判断这M个点在凸包内的点数num是否大于等于K,如果num>=K输出YES,否则输出NO。

解题思路:

首先我们求出这个凸包(听别人说这个凸包已经逆时针给出的了,但是我比较习惯以最左最下的点做基准来极角排序【注意:如果有几点在凸包的同一条边上,那么需要把中间的点都去掉,只留下两段的点,这样好处理】,一下的算法都建立在之上。)首先我们设这个基准点为P0,所以对于一个读进来的点Qi,如果有XP0<XQi,那么显然Q不在凸包内。之后我们将满足上述判断条件的点去掉,然后,将所有点Qi对于P0的极角序求出来,然后排序。

假设对于Qi,凸包内极角序将Qi的极角序包夹的两个点是Pv,Pu(u=v+1),那么Qi在凸包中的条件就是Qi在P0,Pv,Pu三个点围成的三角形内,这基本上是很简单的了,直接算一下SΔP0PvQi+SΔP0PuQi<=SΔP0PvPu满足则表示在三角形内,否则不在。

那么如何找Pv,Pu呢,可以根据Pi极角的单调性二分,也可以根据Pi,Qi极角的单调性直接线性扫就行了。

【注意:此题很多边界条件,坑爆了,还有极角序最大最小的凸包上的点可能要特判等等。。。。。。反正我是无限wa】

AC代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>

using namespace std;

const double eps=1e-8;
int n,k,m;
int ff=0;
int up=-2e9+1,down=2e9+1;
struct dian_
{
    int x,y;
    double k;
}dian[100010]={{0,0,0}},cx[100010]={{0,0,0}};
int cxp=0;
int hash[100010]={0};
int np=0;

bool cmp(struct dian_ a1,struct dian_ a2)
{return a1.k>a2.k;}

long double counts(struct dian_ a1,struct dian_ a2,struct dian_ bb)
{return fabs((long double)(a1.x-bb.x)*(a2.y-bb.y)-(long double)(a2.x-bb.x)*(a1.y-bb.y))/2;}

bool check(int a1,int a2,int bb)
{
    long double area1=counts(dian[a1],dian[a2],dian[1]);
    long double area2=counts(dian[a1],cx[bb],dian[1])+counts(dian[a2],cx[bb],dian[1]);
    if(area2<=area1+eps) return true;
    else return false;
}

int main()
{
    scanf("%d%d%d",&n,&m,&k);
    ff=1;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&dian[i].x,&dian[i].y);
        if(dian[i].x<dian[ff].x || (dian[i].x==dian[ff].x && dian[i].y<dian[ff].y))
            ff=i;
    }
    swap(dian[1],dian[ff]);
    up=dian[1].y,down=dian[1].y;
    for(int i=2;i<=n;i++)
    {
        if(dian[1].x==dian[i].x)
        {
            dian[i].k=(dian[i].y>dian[1].y?1:-1)*(2e9+1);
            up=max(up,dian[i].y);
            down=min(down,dian[i].y);
        }
        else dian[i].k=(double)(dian[i].y-dian[1].y)/(dian[i].x-dian[1].x);
    }
    sort(dian+2,dian+n+1,cmp);
    for(int i=1;i<=m;i++)
    {
        int p,q;
        scanf("%d%d",&p,&q);
        if(p<dian[1].x)
            continue;
        if(p==dian[1].x)
        {
            if(q<=up && q>=down)
                k--;
            continue;
        }
        cxp++;
        cx[cxp].x=p,cx[cxp].y=q;
        cx[cxp].k=(double)(cx[cxp].y-dian[1].y)/(cx[cxp].x-dian[1].x);
    }
    sort(cx+1,cx+cxp+1,cmp);
    for(int i=3;i<=n;i++)
    {
        if(counts(dian[i],dian[i-1],dian[1])<=eps)
        {
            hash[i-1]=1;
            if(dian[i-1].x>dian[i].x)
                dian[i]=dian[i-1];
        }
    }
    for(int i=1;i<=n;i++)
        if(hash[i]==0)
            dian[++np]=dian[i];
    int cnt=2;
    for(int i=1;i<=cxp;i++)
    {

        int flag=0;
        if(counts(cx[i],dian[cnt],dian[1])<=eps)
            if(cx[i].x<=dian[cnt].x)
            {
                k--;
                continue;
            }
        for(;cnt<=np && cx[i].k<dian[cnt].k;cnt++)
            if(counts(cx[i],dian[cnt],dian[1])<=eps)
                if(cx[i].x<=dian[cnt].x)
                {
                    k--;
                    flag=1;
                    break;
                }
        if(flag==1) continue;
        if(cnt==2) continue;
        if(cnt==n+1) continue;
        if(check(cnt-1,cnt,i)==true)
            k--;
    }
    if(k<=0) puts("YES");
    else puts("NO");
    return 0;
}
时间: 2024-10-12 16:01:52

sgu-253 Theodore Roosevelt的相关文章

2016.9.26小程序---数据库练习2

1 -- createnobel, 1, 50 2 DROP TABLE nobel; 3 CREATE TABLE nobel( 4 yr INT -- 年份 5 ,SUBJECT VARCHAR(15) -- 奖项 6 ,winner VARCHAR(50) -- 获奖者 7 )DEFAULT CHARSET=utf8; 8 9 GO 10 -- tabnobel, 1, 50 11 INSERT INTO nobel VALUES (1901,'Chemistry','Jacobus H.

02_numpy

numpy get started 导入numpy库,并查看numpy版本 import numpy as np np.__version__ '1.13.0' import matplotlib.pyplot as plt cat = plt.imread('cat.jpg') print(cat) [[[231 186 131] [232 187 132] [233 188 133] ..., [100 54 54] [ 92 48 47] [ 85 43 44]] [[232 187 13

&lt;老友记&gt;学习笔记

这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的情路坎坷,事业成败和生活中的喜怒哀乐,无时无刻不牵动着彼此的心,而正是正平凡的点点滴滴,却成为最令人感动与留恋的东西. 人物:1.瑞秋•格林(RACHEL GREENE)由珍妮佛•安妮斯顿(Jennifer Aniston)扮演 瑞秋是莫妮卡的高中同学,在与牙医未婚夫的婚礼上脱逃至莫妮卡处. 2.罗

每周总结③

7-11 1:backbone路由选择<a href="#xxxx">---锚点会加在url后面 2:  SVN的使用 ①update 将SVN服务器最新版本下载到本地 ②commit将本地改动上传到SVN服务器 这是因为,你代码可能不是最新的!比如你的代码是10月1日的下载的版本 10月2日,呆B王更新了其中一个文件,比如是 test.java 上传了svn,10月3日,你也要修改 test.java 这个文件.如果说,你没有更新,直接修改.然后上传了svn.那现在svn

什么是 Backbone.js

Backbone.js 是一个在JavaScript环境下的 模型-视图-控制器 (MVC) 框架.任何接触较大规模项目的开发人员一定会苦恼于各种琐碎的事件回调逻辑.以及金字塔般的代码.而且,在传统的Web应用程序代码中,不可避免的都有在应用逻辑中加入显示数据的代码的情况.当项目规模愈发变大时,这种形式的代码变得越发的难以维护,因为任何在主干逻辑中的变更都可能影响到数据显示逻辑,反之亦然. Backbone就是要来解决这样的代码耦合的问题.它通过提供一个控制层-显示层的框架,以及模版(templ

历年诺贝尔和平奖

历届得主 获奖时间 得主(国籍) 角色(Role) 领域(Field) 1901年 琼·亨利·杜南(瑞士)[93] Jean Henry Dunant 日内瓦公约发起者, 红十字国际委员会的创始人 人道主义工作,和平运动 弗雷德里克·帕西(法国)[94] Frédéric Passy 第一个法国和平协会创始人兼主席 1902年 埃利·迪科门(瑞士) élie Ducommun[95]  国际和平局(瑞士伯尔尼)名誉秘书 和平运动 夏尔莱·阿尔贝特·戈巴特(瑞士) Albert Goba[96] 

Where product development should start

We all need to know our customers in order to create products they’ll actually buy. This is why the minimum viable audience idea is so powerful. It doesn’t start with the product. It starts with the customer. That means the media you create — the dai

sqlzoo练习答案--SELECT from Nobel Tutorial/zh

nobel 諾貝爾獎得獎者 我們繼續練習簡單的單一表格SQL查詢. 這個教程是有關諾貝爾獎得獎者的: nobel(yr, subject, winner) yr subject winner 1960 Chemistry Willard F. Libby 1960 Literature Saint-John Perse 1960 Medicine Sir Frank Macfarlane Burnet 1960 Medicine Peter Madawar ... yr: 年份subject:

Dataquest用户数据分析

Thinking Through Analytics Data 本文将介绍如何从头到尾对数据进行分析.我们将探索Dataquest这个网站上用户的匿名化分析数据.我们将探索用户是如何进行学习的,数据源主要有两个: 数据库 外部分析者提供,比如keen.io A Quick Look At Dataquest 首先需要明确Dataquest这个网站是怎样构造的:当前处在一个任务中,任务是由数据库,以及教授的一些技能组成.每个任务包含多个屏幕(screen ),屏幕的目录在右边,可以点击它跳到相应的