题目描述

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. Luckily the description of these points is rather simple. The whole country has been mapped using a Cartesian Coordinate System (where (0, 0) is the location of the Greenwich Observatory). The corners of all land properties are located at integer coordinates according to this coordinate system. Test points for ground water have to be erected on every point inside a property whose coordinates are integers.

输入

The input consists of:
• one line with a single integer n (3 ≤ n ≤ 100 000), the number of corner points of your property;
• n lines each containing two integers x and y (−106 ≤ x, y ≤ 106 ), the coordinates of each corner.
The corners are ordered as they appear on the border of your property and the polygon described by 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

题目大意:求一个多边形内整数点的个数,顶点已经给出.

题目思路:

模板类型题目,套用pick定理:

在坐标为整数的二维平面内,对于任意多边形,有s=a+b/2-1.其中b是落在边上的点数,a是内部点数,s是多边形的面积

其中落在边上的点的数目为:gcd(dx,dy),dx,dy 分别为两顶点之间连线的横纵坐标之差的绝对值.

由pick定理得:

a=s-b/2+1

所以第一个未知数 b可以求,第二个s也可以求 套用多边形面积公式:

s=1/2(x1*y2-x2*y1+x2*y3-x3*y2~~~~~~)

即可得出:

#include <bits/stdc++.h>
#define E 2.718
using namespace std;
typedef long long ll;
const ll INF=0x7f7f7f7f;
const int maxn=1e6+8;
const double eps=1e-10;
const ll mod=1000000007;
ll n,m,b;
struct node{ll x,y;
}p[100005];
ll gcd(ll a,ll b)
{if(!b) return a;return gcd(b,a%b);
}
/***pick定理:
在坐标为整数的二维平面内,对于任意多边形,有s=a+b/2-1.
其中b是落在边上的点数,a是内部点数,s是多边形的面积
***/
ll cal()
{ll sum=0;// x1*y2-x2*y1for(int i=1;i<=n;i++){int e=(i+1)%n?(i+1)%n:n;sum+=p[i].x*p[e].y-p[e].x*p[i].y;}return sum;
}
int main()
{ll s,b=0;scanf("%lld",&n);for(int i=1;i<=n;i++) scanf("%lld%lld",&p[i].x,&p[i].y);for(int i=1;i<=n;i++){ll e=(i+1)%n==0?n:(i+1)%n;ll dx=abs(p[i].x-p[e].x);ll dy=abs(p[i].y-p[e].y);if(dx==0) b+=dy;//横坐标相同 边上数目为 dyelse if(dy==0) b+=dx;//同上else b+=gcd(dx,dy);}s=abs(cal()/2);printf("%lld\n",s-b/2+1);return 0;
}

【upc】Water Testing 皮克定理+多边形面积公式相关推荐

  1. POJ 1265-Area(计算几何+皮克定理+多边形面积公式)

    题目地址:POJ 1265 题意:给定一个格点多边形,求出内部点数in,边上点数on,和面积S. 思路:运用的定理很多. 1.皮克定理:S=in+on/2-1,即in=(2*S+2-on)/2. 2. ...

  2. 已知三个点坐标求 三角形面积 || 求任意多边形面积公式||判断点在直线的左侧还是右侧

    已知三个点坐标求 三角形面积 由A-->B-->C-->A 按逆时针方向转.(行列式书写要求) 设三角形的面积为S 则S=(1/2)*(下面行列式) |x1 y1 1| |x2 y2 ...

  3. Pick定理(一个计算点阵中顶点在格点上的多边形面积公式)

  4. Acwing:通电围栏(皮克定理)

    题目描述 农夫约翰的牧场可以看作是一个二维平面. 约翰为了方便看管他养的牛,构建了一个三角形的通电围栏. 他希望他的奶牛都在围栏围起的区域内活动. 三角形围栏的三个顶点位置坐标分别为 (0,0),(n ...

  5. Electric Fences_usaco3.4_皮克定理

    Description 给定两个整点(m,n)(m,n)和(p,0)(p,0),与坐标原点(0,0)(0,0)构成三角形,求三角形内的整点数量 Analysis 找到这么一道神奇的题目以及神奇的定理 ...

  6. 欧几里德算法与皮克定理

    欧几里德算法概述: 欧几里德算法 又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: gcd函数就是用来求(a,b)的最大公约数的. gcd函数的基本性质: gcd(a, ...

  7. Java 根据多边形坐标点 计算多边形面积

    请仔细阅读代码注释(有肯多坑,跟着注释走没问题) 亲测有效 /*** 计算多边形面积公式** @author Lion Li* @date 2020-05-19*/ public class Poly ...

  8. poj12652954 [皮克定理 格点多边形]【学习笔记】

    Q:皮克定理这种一句话的东西为什么还要写学习笔记啊? A:多好玩啊... PS:除了蓝色字体之外都是废话啊...  Part I 1.顶点全在格点上的多边形叫做格点多边形(坐标全是整数) 2.维基百科 ...

  9. pku 2954 Triangle pku 1265 Area Pick定理的应用 + 叉积求多边形面积

    Pick定理证明:http://translate.google.com/translate?u=http://episte.math.ntu.edu.tw/articles/sm/sm_25_10_ ...

  10. 使用行列式公式求多边形面积

    namespace SKJZ {namespace lib{public struct Point { public float x, y;}public class Polygon{/// < ...

最新文章

  1. TestNG方法測试及注意要点 代码及配置具体解释(解决testng方法不运行问题)
  2. 在RHEL 6.5上安装grid报错libcap.so.1
  3. Java 将字符串转换为字符数组 toCharArray()
  4. TimesIsMoney
  5. 每天一个小程序—0004题(统计单词出现次数)
  6. 转:PriorityQueue
  7. kvm虚拟机安装esxi服务器,VMware vSphere虚拟机迁移至KVM virt-v2v方案
  8. iframe关闭当前窗口_iframe 、 a标签、input标签
  9. dede图片上传php,织梦DEDE 栏目字段添加并调用:例如图片上传
  10. Django 学习 Blog 实操 19 --- 统计分类、标签云下的文章数目
  11. matlab 傅里叶变换频谱
  12. 用python对我和女票的聊天记录生成心形词云
  13. 数模算法与应用:预测模型(1)美日硫磺岛战役模型
  14. 大数据应用对企业税务风险管理影响
  15. Shader混合模式--正片叠底、滤色、叠加
  16. esxi怎么传输文件到虚拟机_软路由篇2:3865U软路由折腾记——Esxi软虚拟机+OpenWrt教程
  17. 脿什么意思_襆怎么读_襆组词和拼音
  18. /proc/sysrq-trigger文件的功能
  19. 双线性插值与三线性插值
  20. ubuntu18.04同时使用多个有线网络和无线网络时如何设置优先级

热门文章

  1. 深入理解Android之Xposed详解
  2. AAAI2020论文列表(中英对照)
  3. C ++程序将字符串的每个单词的首字母转换为大写,将其他转换为小写
  4. mysql strict_mysql 严格模式 Strict Mode说明
  5. 二烷基二硫代磷酸锌添加剂的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  6. Mina中的多项式承诺方案
  7. 五种常用的Web安全认证方式
  8. Android Dialog之间的层级设置(WindowManager.LayoutParams)
  9. 如何让计算机按图片的顺序打印,如何将电脑中的几张图片打印在一张纸上
  10. 软件测试周刊(第67期):用一颗浏览的心,去看待人生,一切的得与失、隐与显,都是风景与风情。