zoukankan      html  css  js  c++  java
  • 【14.36%】【codeforces 614C】Peter and Snow Blower

    time limit per test2 seconds
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output
    Peter got a new snow blower as a New Year present. Of course, Peter decided to try it immediately. After reading the instructions he realized that it does not work like regular snow blowing machines. In order to make it work, you need to tie it to some point that it does not cover, and then switch it on. As a result it will go along a circle around this point and will remove all the snow from its path.

    Formally, we assume that Peter’s machine is a polygon on a plane. Then, after the machine is switched on, it will make a circle around the point to which Peter tied it (this point lies strictly outside the polygon). That is, each of the points lying within or on the border of the polygon will move along the circular trajectory, with the center of the circle at the point to which Peter tied his machine.

    Peter decided to tie his car to point P and now he is wondering what is the area of ​​the region that will be cleared from snow. Help him.

    Input
    The first line of the input contains three integers — the number of vertices of the polygon n (), and coordinates of point P.

    Each of the next n lines contains two integers — coordinates of the vertices of the polygon in the clockwise or counterclockwise order. It is guaranteed that no three consecutive vertices lie on a common straight line.

    All the numbers in the input are integers that do not exceed 1 000 000 in their absolute value.

    Output
    Print a single real value number — the area of the region that will be cleared. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.

    Namely: let’s assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if .

    Examples
    input
    3 0 0
    0 1
    -1 2
    1 2
    output
    12.566370614359172464
    input
    4 1 -1
    0 0
    1 2
    2 0
    1 1
    output
    21.991148575128551812
    Note
    In the first sample snow will be removed from that area:
    【题解】

    容易想到最后会形成个圆环(那个P点题目有说不会包括在多边形内);
    要求的是这个圆环的面积;
    ->设p点与多边形上的点的距离最远的是r1,最近的是r2;
    要获取r1->肯定是在点上。
    要获取r2则可能是在点上也可能是在边上。
    如下图,第二种和第三种最近的在点上,第一种则在边上且距离是三角形AB边上的高(海伦公式搞搞);
    区别这几种的方法就是判断角A和角B是不是钝角(余弦定理余弦值小于0);
    这里写图片描述

    #include <cstdio>
    #include <cmath>
    #include <set>
    #include <map>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <stack>
    #include <string>
    #define lson L,m,rt<<1
    #define rson m+1,R,rt<<1|1
    #define LL long long
    
    using namespace std;
    
    const int MAXN = 2e5;
    
    const int dx[5] = {0,1,-1,0,0};
    const int dy[5] = {0,0,0,-1,1};
    const double pi = acos(-1.0);
    
    int n;
    double a[MAXN][2];
    
    void input_LL(LL &r)
    {
        r = 0;
        char t = getchar();
        while (!isdigit(t) && t!='-') t = getchar();
        LL sign = 1;
        if (t == '-')sign = -1;
        while (!isdigit(t)) t = getchar();
        while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
        r = r*sign;
    }
    
    void input_int(int &r)
    {
        r = 0;
        char t = getchar();
        while (!isdigit(t)&&t!='-') t = getchar();
        int sign = 1;
        if (t == '-')sign = -1;
        while (!isdigit(t)) t = getchar();
        while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
        r = r*sign;
    }
    
    double sqr(double x)
    {
        return x*x;
    }
    
    double dis(int q,int w)
    {
        return sqrt(sqr(a[q][0]-a[w][0])+sqr(a[q][1]-a[w][1]));
    }
    
    int main()
    {
       // freopen("F:\rush.txt","r",stdin);
        scanf("%d%lf%lf",&n,&a[0][0],&a[0][1]);
        for (int i = 1;i <= n;i++)
            scanf("%lf%lf",&a[i][0],&a[i][1]);
        double r1 = dis(1,0),r2 = dis(1,0);
        a[n+1][0]=a[1][0];
        a[n+1][1] = a[1][1];
        for (int i = 1;i <= n;i++)
        {
            double a = dis(i,0),b = dis(i+1,0),c = dis(i,i+1);
            double judge1 = sqr(b)+sqr(c)-sqr(a),judge2 = sqr(a)+sqr(c)-sqr(b);
            if (judge1<0 || judge2 <0)
                r2 = min(r2,min(a,b));
            else
            {
                double p = (a+b+c)/2;
                r2 = min(r2,2*sqrt(p*(p-a)*(p-b)*(p-c))/c);
            }
            r1 = max(r1,a);
        }
        printf("%.10lf
    ",pi*(sqr(r1)-sqr(r2)));
        return 0;
    }
  • 相关阅读:
    为Docker容器配置固定IP
    Docker CPU 资源限制——CPU分片功能测试
    Centos7下用命令下载jdk7及jboss-eap-6
    Docker CPU 资源限制——CPU固定核功能测试
    更改MySQL数据文件目录位置
    Linux下资源利用率监测利器—nmon使用
    图示-Centos7完整安装
    Photoshop图层混合模式计算公式大全
    HMC5883L地磁传感器驱动
    ADXL345加速度传感器驱动
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632101.html
Copyright © 2011-2022 走看看