Hrbustoj 1429 二分+计算几何

http://www.bubuko.com/infodetail-1121744.html 在这个上面学习了方法 如果要判断巨量的点 就应该使用二分法

思路是先从a[1] a[n] a[2]来判断是否可能在图形内 如果这个都通不过就不用再判断下边的了

然后从 2 到 n 开始二分 确定两个相邻向量 使寻找点必在这两个向量的夹角里

然后就是点是否在三角形内了 由于已经判断了两条边了 最后只判断第三条即可

一开始 二分的while条件写的是r-l!=0 最后得到的效果是 点必定在r l向量的夹角内

然而超时 很不理解QAQ

后来学习了网上的办法 设定条件l<r 这样最后得到的l其实是等于r的 点在l l-1的夹角内

学习的方法里提到了一点 位运算比乘除运算快非常多

分别尝试了一下 位运算 485ms 正常乘除 541ms

自己写的代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
struct point
{
    double x,y;
};
double cross(point a,point b,point c)
{
    return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
int main(){
int n;
while(~scanf("%d",&n))
{
    point a[n+1];
    for(int i=1;i<=n;i++)
    {
        scanf("%lf%lf",&a[i].x,&a[i].y);
    }
    bool ok=true;
    int m;
    scanf("%d",&m);
    point p[m];
    for(int i=0;i<m;i++)
    {
        scanf("%lf%lf",&p[i].x,&p[i].y);

    }
    for(int i=0;i<m;i++)
    {
        if(cross(a[1],p[i],a[2])<=0||cross(a[1],a[n],p[i])<=0)
        {
            ok=false;
            break;
        }
        int l=2;
        int r=n;
        int m;
        while(l<r)
        {
            m=(r+l)/2;/// m=(r+l)>>1 更快一些
            if(cross(a[1],p[i],a[m])<=0)
            {
                r=m;
            }
            else l=m+1;
        }
        if(cross(a[l],p[i],a[l-1])>=0)
        {
            ok=false;
            break;
        }
    }

    if(ok==true)
        printf("YES\n");
    else printf("NO\n");
}
}

  

时间: 2024-10-05 19:19:41

Hrbustoj 1429 二分+计算几何的相关文章

Codeforces 8D Two Friends 三分+二分+计算几何

题目链接:点击打开链接 题意:点击打开链接 三分house到shop的距离,二分这条斜边到cinema的距离 #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #include<set> #include<queue> #include<vector> #include<

【二分+计算几何】hdu 4033 Regular Polygon

[二分+计算几何]hdu 4033 Regular Polygon 题目链接:hdu 4033 Regular Polygon 题目大意 已知正多边形中的一个内点到所有顶点的距离,求多边形的边长. 二分问题一般都存在含有一个未知量的方程(等式关系),通过二分未知量的范围实现查找,这道题目的几何关系就是:知道一边,内角和(围着内点)等于360度.根据三角不等式确定边的二分范围,二分查找边使得内角之和为2π即可. 说一下思路 笔者根据第一条边和最后一条边确定二分边的范围,边确定由余弦定理能确定所有内

POJ 1905 Expanding Rods (二分+计算几何+精度处理)

题目地址:POJ 1905 用二分枚举h,然后判断弧长是否符合条件.重点还是在精度问题上,具体看代码吧.. #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #includ

UVAlive 7366 Brocard(二分+计算几何)

题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5388 思路:二分Brocard angle设为rad,将两条边(AB,BC)按该角度旋转,求出两条边的交点P,判断CA与CP所成角度ang是否等于该角度,若rad>ang则rad应减小(r=mid),即使得ang变大,否则rad应增大(l=mid),直到两者相

POJ 1905-Expanding Rods(二分+计算几何)

题目地址:POJ 1905 题意:一根某种材料做的直杆被夹在两面墙之间,当他受热时长度变长,就会因两面墙的挤压而向上隆起.长度变化函数为 L'=(1+n*C)*L,给定L,C,n,求向上拱起的高度H. 思路: 手动计算出这两个公式,然后用二分查找h值. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #

POJ 2002 二分 计算几何

根据正方形对角的两顶点求另外两个顶点公式: x2 = (x1+x3-y3+y1)/2; y2 = (x3-x1+y1+y3)/2; x4= (x1+x3+y3-y1)/2; y4 = (-x3+x1+y1+y3)/2; #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1000+5; struct Node { int x,y; bool

BZOJ 2732: [HNOI2012]射箭

Description 问一条过原点的抛物线最多能连续穿过几条线段.\(n \leqslant 10^5\) Solution 二分+计算几何半平面交过一条线段可以变成两个不等式,都写成\(ax+by+c\geqslant 0\)的形式.这题蜜汁精度.. Code /************************************************************** Problem: 2732 User: BeiYu Language: C++ Result: Accep

【POJ】2318 TOYS ——计算几何+二分

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10281   Accepted: 4924 Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a problem - their child John never puts his toys away w

【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流

题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵. 在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放.不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以