首页 > 其他分享 >Distance to Work (牛客多校) (圆和简单多边形相交面积 + 二分半径)

Distance to Work (牛客多校) (圆和简单多边形相交面积 + 二分半径)

时间:2023-06-28 12:56:12浏览次数:42  
标签:Distance return Point int double Work 多校 Vector theta

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-9;            //浮点数精度控制
#define Vector point
#define Point point
const double PI = acos(-1);
struct Point{
    double x,y;
    Point(double x=0,double y=0) :x(x),y(y){}
    friend Vector operator + (Vector A,Vector B){ return Vector(A.x + B.x , A.y + B.y);}
    friend Vector operator - (Point A,Point B){ return Vector(A.x - B.x , A.y - B.y);}
    friend Vector operator * (Vector A,double p) {return Vector(A.x*p , A.y*p);}
    friend Vector operator / (Vector A,double p) {return Vector(A.x/p,A.y/p);}
    friend bool operator < (const Point &a,const Point &b){
    return a.x< b.x || ( a.x == b.x && a.y < b.y);
    }
};
int dcmp(double k){
    return k < -eps ?-1:k>eps?1:0;
}
double sqr(double k){return k*k;}
double mysqrt(double n){ return sqrt(max(0.0,n));}
double cross(Vector A,Vector B){return A.x*B.y - A.y*B.x;}
double dot(Vector A,Vector B){return A.x*B.x + A.y*B.y;}
double abs(Point o){return sqrt(dot(o,o));}
point _a[205],o;
int P,Q;
int n;
double r;
double ALL;
void circle_cross_line(Point a,Point b,Point o,double r,Point ret[],int &num){
    double x0 = o.x,y0 = o.y;
    double x1 = a.x,y1 = a.y;
    double x2 = b.x,y2 = b.y;
    double dx = x2 - x1,dy = y2-y1;
    double A = dx*dx +dy*dy;
    double B = 2*dx*(x1-x0)+2*dy*(y1-y0);
    double C = sqr(x1-x0)+sqr(y1-y0)-sqr(r);
    double delta = B*B - 4*A*C;
    num = 0;
    if(dcmp(delta)>=0){
    double t1 = (-B-mysqrt(delta))/(2*A);
    double t2 = (-B+mysqrt(delta))/(2*A);
    if(dcmp(t1-1)<=0 && dcmp(t1)>=0){
        ret[num++] = Point(x1+t1*dx , y1 + t1*dy);
    }
    if(dcmp(t2-1)<=0 && dcmp(t2)>=0){
        ret[num++] = Point(x1 + t2*dx,y1+t2*dy);
    }
    }

}
double sector_area(point a,point b){
    double theta = atan2(a.y,a.x) - atan2(b.y,b.x);
    while(theta <=0) theta+=2*PI;
    while(theta > 2*PI) theta -= 2*PI;
    theta = min (theta,2*PI - theta);
    return r*r *theta / 2;
}
double calc(Point a,Point b){
    Point p[2];
    int num = 0;
    int ina = dcmp(abs(a)-r)<0;
    int inb = dcmp(abs(b)-r)<0;
    if(ina){
    if(inb){
        return fabs(cross(a,b))/2.0;
    }else{
        circle_cross_line(a,b,Point(0,0),r,p,num);
        return sector_area(b,p[0])+fabs(cross(a,p[0]))/2.0;
    }
    }else{
    if(inb) {
        circle_cross_line(a,b,Point(0,0),r,p,num);
        return sector_area(p[0],a)+fabs(cross(p[0],b))/2.0;
    }else{
        circle_cross_line(a,b,Point(0,0),r,p,num);
        if(num == 2){
        return sector_area(a,p[0]) + sector_area(p[1],b)
            + fabs(cross(p[0],p[1]))/2.0;
        }else {
        return sector_area(a,b);
        }

    }
    }
}
double area(){
    double ret = 0;
    for(int i = 1;i<=n;i++){
    int sgn = dcmp(cross(_a[i],_a[i+1]));
    if(sgn!=0) ret+=sgn * calc(_a[i],_a[i+1]);
    }
    return abs(ret);
}
bool check()
{
    double are = area();
    if(dcmp(are - ALL)<0) return false;
    return true;
}
Point __a[206];
double PolygonArea(){
    double area = 0;
    for(int i = 2;i<n;i++)
    {
    area+=cross(__a[i] - __a[1],__a[i+1] - __a[1]);
    }    
    return fabs(area*0.5);
}
int main()
{
    cin>>n;
    for(int i = 1;i<=n;i++) cin>>__a[i].x>>__a[i].y;
    __a[n+1] = __a[1];
    n++;
    int m;cin>>m;
    double all = PolygonArea();
    while(m--)
    {
         cin>>o.x>>o.y>>P>>Q;
        for(int i = 1;i<=n;i++) _a[i] = __a[i] - o;
        P = Q-P;
        ALL = P*all/Q;
        double L = 0,R = 5000000;
        while(dcmp(L-R)!=0)
        {
            r =(L+R)/2.0;
            if(check()) R = r;
            else L = r;
        }
        printf("%.10f\n",L);
    }
}
模板代码

 

标签:Distance,return,Point,int,double,Work,多校,Vector,theta
From: https://www.cnblogs.com/Lamboofhome/p/17511109.html

相关文章

  • Shuffle Cards (牛客多校) (rope 块状链表 用作可持续优化平衡树, 用于区间的整体移动
    rope:#include<ext/rope>usingnamespace__gnu_cxx; 定义方法:rope<变量类型>变量名称;人话解释:超级string算法解释:块状链表(即讲链表与数组的优势结合,形成分块思想)用途解释:这本来是一个用于快速操作string的工具,却一般被定义成int,然后用作可持久化线段树!insert(intpos,s......
  • PACM Team (牛客多校) (DP 01背包, 维度较多)
    题目大意:给出n个物品,物品有4个空间值,然后有一个权值问在不超过最大的空间值时,最大的权值  思路:一开始想了很多其他思路没有想出来开始广搜算法,发现dp可以解决(注意看数据范围,是满足的)遇到奇怪的题,就试试dp,特别在数据范围很小的时候 ......
  • Dual Path Network(DPN)
    论文地址:https://arxiv.org/pdf/1707.01629.pdf模型及代码:github.com/cypw/DPNs本文认为:1)ResNet通过这种跨层参数共享和保留中间特征的方式,特征re-use,ResNet将输出与输入相加,形成一个残差结构,可以有效的降低特征上冗余度,重复利用已有特征,但缺点在于难以利用高层信息再发掘底层特......
  • Visualizing and Understanding Convolutional Networks
    《VisualizingandUnderstandingConvolutionalNetworks》 MatthewDZeiler,RobFergus(ECCV2014) 论文:http://t.cn/RyYKQ8z视频: http://t.cn/RyYKQ87------------------------------------------------------------------------------------------------------一、相关......
  • 【五期邹昱夫】CCF-B(IEEE Access'19)Badnets: Evaluating backdooring attacks on deep
    "Gu,Tianyu,etal."Badnets:Evaluatingbackdooringattacksondeepneuralnetworks."IEEEAccess7(2019):47230-47244."  本文提出了外包机器学习时选择值得信赖的提供商的重要性,以及确保神经网络模型安全地托管和从在线存储库下载的重要性。并展示了迁移学习场......
  • 【五期邹昱夫】CCF-B(RAID'18)Fine-Pruning: Defending Against Backdooring Attacks on
    "Liu,Kang,BrendanDolan-Gavitt,andSiddharthGarg."Fine-pruning:Defendingagainstbackdooringattacksondeepneuralnetworks."ResearchinAttacks,Intrusions,andDefenses:21stInternationalSymposium,RAID2018,Heraklion,Crete,......
  • 【考后总结】6 月多校国赛模拟赛 6
    6.27冲刺国赛模拟25T1简单计数不是古典概型所以不能方案数相除。考虑枚举第一个选择的位置\(i\),这样分成两个独立的区间,只关心\(k\)所在的一个,转移方程:\[f_{n,k}=\dfrac{1}{n-1}\left([k<n]+[k>1]+\sum_{i>k}f_{i-1,k}+\sum_{i<k-1}f_{n-(i+1),k-(i+1)}\right)\]前缀和......
  • 【考后总结】6 月西安多校国赛模拟赛 3
    6.17冲刺国赛模拟20T1树染色容易发现每种方案都可以变成没有交边的链剖分,在此基础上的方案数是每个链顶的深度,考虑DP。直接DP大致是维护\(\prod(\proda+\prodb)\timesdep_{top}\),发现这个东西非常不好转移,转移时需要枚举叶子,复杂度不优秀。改为设\(f_{i,0/1}\)表......
  • 【考后总结】6 月西安多校国赛模拟赛 4
    6.21冲刺国赛模拟22T1跳跃不妨看作两只青蛙从相同起点出发且跳跃次数相同,设\(f_{i,j,k}\)为两只青蛙分别在\(i,j\)位置,且相差步数\(k\)。由于需要记录相邻位置对答案贡献,我们在要求必须严格按照升序对处理状态,也就是必须保证当前跳跃的一只青蛙落点在另一只青蛙更前面,且......
  • 【考后总结】6 月西安多校国赛模拟赛 5
    6.24冲刺国赛模拟24T2简单图论题原题:Gym-104053CCustomsControls2构造题。这个限制可以进一步加强到对于每个节点\(u\),\(1\tou\)的路径权值都相等,定义为\(d_u\)。于是对\(u\)连边的两个节点的\(d\)一定相等,进而可以把所有相等的缩到一起,且这些点直接不能连边(点......