【计算几何】Codeforces Round #113 (Div. 2)-B. Polygons

原创 2012年03月28日 21:14:53

其实是很裸的一道几何题,题目要求的就是判断一个小的多边形是否完全且严格(两个多边形不能有交点)包含在另一个凸多边形里面。而解决的方法有很多,我这里用到的就是判断一个点是否完全且严格包含在一个多边形内,判断的时候用到了二分和叉积。

题目

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100005
struct node
{
    int x,y;
}p[N];
__int64 xcross(node t,node t1,node t2)
{
    return (__int64)(t1.x-t.x)*(t2.y-t.y)-(__int64)(t2.x-t.x)*(t1.y-t.y);
}
int n;
bool check(node t)
{
    if(xcross(t,p[0],p[n-1])==0)return false;            //判断是否在线(0,1)上
    if(xcross(t,p[1],p[0])==0)return false;            //判断是否在线(0,n-1)上
    int l=0,r=n-1,best;
    while(l<=r)
    {
        int m=(l+r)/2;
        if(xcross(t,p[m],p[0])>=0)
        {
            best=m;            //这里得到的best是和点t最接近的那条边的一段
            l=m+1;
        }
        else r=m-1;
    }
    if(xcross(t,p[best],p[best+1])>=0)return false;            //判断点t在线(best,best+1)的那一边
    return true;
}
int main()
{
    //freopen("a.txt","r",stdin);
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y);
    int m;
    scanf("%d",&m);
    bool flag=true;
    while(m--)
    {
        node t;
        scanf("%d%d",&t.x,&t.y);
        if(flag)flag=check(t);
    }
    if(flag)printf("YES\n");
    else printf("NO\n");
    return 0;
}


Codeforces Round #378 (Div. 2) E. Sleep in Class

链接:http://codeforces.com/contest/733/problem/E 题意:给一个只含'U'和'D'的字符串,U表示向右走,D表示向左走。每个格子踩一次之后翻转(U变D,D变...
  • Fsss_7
  • Fsss_7
  • 2016年11月15日 13:48
  • 359

Codeforces Round #258 (Div. 2)-(A,B,C,D,E)

A:Game With Sticks 水题。。。每次操作,都会拿走一个横行,一个竖行。 所以一共会操作min(横行,竖行)次。 #include #include #include #include ...
  • rowanhaoa
  • rowanhaoa
  • 2014年07月25日 14:39
  • 1472

【解题报告】Codeforces Round #401 (Div. 2)

简略的解题报告。
  • TRiddle
  • TRiddle
  • 2017年02月25日 17:55
  • 410

Codeforces Round #395 (Div. 2)(ABCD)

ps:打完这场cf才知道自己真的很菜,还是停留在AB题的水平,有时候CD其实很简单,但就是想不到,别人一眼看出而我就是想不到,有时候想到了点子上但就是突破不了 题目链接:  Codeforc...
  • qq_34731703
  • qq_34731703
  • 2017年02月03日 12:50
  • 492

Codeforces Round #315 (Div. 1)

Codeforces Round #315 (Div. 1)
  • u013023344
  • u013023344
  • 2015年08月16日 21:31
  • 1064

Codeforces Round #460 (Div. 2) D. Substring(拓扑排序)

题目链接题意:有一个n个点m条边的有向图,每个节点有一个字母,路径的权值是路径上相同字母的最大个数。求最大的路径权值。思路:因为只有26个字母,所以直接假设其中一个字母为相同字母数最大的字母。枚举每一...
  • cyf199775
  • cyf199775
  • 2018年02月01日 13:55
  • 36

Codeforces Round #442 (Div. 2)

A. #include using namespace std; typedef long long ll; int main() { string s; cin >> s; ...
  • Egqawkq
  • Egqawkq
  • 2017年10月24日 02:15
  • 238

Codeforces Round #343 (Div. 2) B. Far Relative’s Problem

B. Far Relative’s Problem time limit per test 2 seconds memory limit per test 256 megaby...
  • Code_KK
  • Code_KK
  • 2016年02月21日 14:11
  • 445

Codeforces Round #428 (Div. 2):D. Winter is here(组合数公式)

D. Winter is here time limit per test 3 seconds memory limit per test 256 megabytes input stan...
  • Jaihk662
  • Jaihk662
  • 2017年08月14日 14:52
  • 346

Codeforces Round #448 (Div. 2) B. XK Segments 排序+二分

题意: 问某种 i-j 对的个数; i-j 对满足 枚举 i j ,当 ai 思路: 我们可以知道,朴素算法就是枚举 ij  这里明显超时, 我们要注意到这里的限制条件: ai ...
  • xiang_6
  • xiang_6
  • 2017年11月27日 18:04
  • 218
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【计算几何】Codeforces Round #113 (Div. 2)-B. Polygons
举报原因:
原因补充:

(最多只允许输入30个字)