zoukankan      html  css  js  c++  java
  • German Collegiate Programming Contest 2017 G. Water Testing

    2020-08-12

    You just bought a large piece of agricultural land, but you noticed that – according to regulations– you have to test the ground water at specific points on your property once a year. Luckilythe description of these points is rather simple. The whole country has been mapped using aCartesian Coordinate System (where (0,0) is the location of the Greenwich Observatory). Thecorners of all land properties are located at integer coordinates according to this coordinatesystem. Test points for ground water have to be erected on every point inside a property whosecoordinates are integers.

    输入

    The input consists of:

    • one line with a single integer n(3≤n≤100000), the number of corner points of yourproperty;

    • n lines each containing two integers x and y(−106≤x,y≤106), the coordinates ofeach corner.

    The corners are ordered as they appear on the border of your property and the polygon describedby the points does not intersect itself.

    输出

    The number of points with integer coordinates that are strictly inside your property.

    样例输入

    4
    0 0
    0 10
    10 10
    10 0
    

    样例输出

    81
    

    分析

    皮克定理: S=a+b/2-1 S: 面积,a: 内部点个数,b: 边缘点个数

    多边形面积可以通过向量叉乘算得,注意凹凸多边形。

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <map>
    #include <vector>
    #include <string>
    
    typedef long long LL;
    
    using namespace std;
    
    long long sidepoint (LL x1, LL y1, LL x2, LL y2)
    {
        return __gcd(abs(x1 - x2), abs(y1 - y2));
    }
    
    int main()
    {
        //S=a+b/2-1
        double S = 0;
        long long x1, y1, x2, y2, x3, y3, xt, yt;
        int t;
        scanf("%d", &t);
        scanf("%lld%lld", &x1, &y1);
        scanf("%lld%lld", &x2, &y2);
        long long sp = sidepoint(x1, y1, x2, y2);
        t -= 2;
        while (t--) {
            scanf("%lld%lld", &x3, &y3);
            sp += sidepoint(x2, y2, x3, y3);
            S += double((x2-x1)*(y3-y1) - (y2-y1)*(x3-x1)) / 2;
            x2 = x3;
            y2 = y3;
        }
        sp += sidepoint(x2, y2, x1, y1);
        printf("%.0lf
    ", fabs(S) + 1.0 - sp*1.0/2);
        //printf("%lf %lld %d ", S, sp, t);
        
        return 0;
    }
    

    by SDUST weilinfox

  • 相关阅读:
    [转]MyBatis传入多个参数的问题
    【转】赶集网mysql开发36军规
    C#套接字和windowsAPI套接字
    java中的注解
    java中的枚举类型
    过去的汇编代码
    近日错误集锦
    java swing模仿随机频谱
    java泛型中的对象
    XML-RPC远程方法调用
  • 原文地址:https://www.cnblogs.com/weilinfox/p/13491742.html
Copyright © 2011-2022 走看看