P1150 - 绳子围点

From 332404521    Normal (OI)
总时限:10s    内存限制:128MB    代码长度限制:64KB

背景 Background

最近小小鱼在研究平面几何,遇到一个难题,怎么也想不出来,于是找到大牛你来帮他做。

描述 Description

给出平面上n个点,所有点的坐标都是整数,小小鱼用一条绳子围成一个封闭图形,把这些点全部围在里面,并且所用绳子长度最短。围好了之后,小小鱼想知道这条绳子总共围住了多少个横、纵坐标都为整数的点(包括给出的n个点和未给出的点,绳子刚好穿过的点也算围在内),但是数着满平面的点,小小鱼晕了过去>.<。

输入格式 InputFormat

第一行一个整数n(n<=200000),表示给出点的个数。
以下n行每行两个整数xi,yi(都在longint范围内),表示给出第i个点的坐标。

输出格式 OutputFormat

一行,一个整数,表示绳子所围住的横纵坐标都为整数的顶点个数。

样例输入 SampleInput [复制数据]

4
-1 -1
1 3
3 1
1 1

样例输出 SampleOutput [复制数据]

10

数据范围和注释 Hint

样例中最短的绳子围法是三个顶点分别为(-1,-1),(3,1),(1,3)的三角形
其中绳子围住了以下点:
(-1,-1),(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2),(3,1),(1,3)
总共10个。

答案可能超过longint的范围,需要用int64或long long。

来源 Source

小小鱼

 
 
pick定理S=I+(A/2)-1; 
 
s是面积,I是多边形内部整点,A是边上整点;
A 用GCD求,注意0的情况。
 
这道题是一道数据量极大,极易出现long long 溢出的题,下面就总结一下这类题要注意的:
  1. 两个[-1e9,1e9]内的int相减会溢出,主要出现再几何题中
  2. 如果在取模题目中,有减运算,注意最后要把他变成正数
  3. 1e9的数据范围忌用double
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 210000
#define eps 1e-9
#define LL "%lld"
typedef long long qword;
int gcd(int x,int y)
{
return (y==)?x:gcd(y,x%y);
}
struct point
{
qword x,y;
}pl[MAXN],seq[MAXN];
bool cmp(const point & p1,const point &p2)
{
if (p1.x==p2.x)return p1.y<p2.y;
return p1.x<p2.x;
}
qword area(const point &p1,const point &p2,const point &p3)
{
return ((qword)(p1.x-p2.x)*(p1.y-p3.y)-(qword)(p1.y-p2.y)*(p1.x-p3.x));
}
int main()
{
freopen("input.txt","r",stdin);
int n;
int i,j;
scanf("%d",&n);
for (i=;i<n;i++)
{
scanf(LL LL,&pl[i].x,&pl[i].y);
}
sort(pl,&pl[n],cmp);
seq[]=pl[];
seq[]=pl[];
int h=;
int top=;
for (i=;i<n;i++)
{
while (top>h && area(seq[top-],seq[top],pl[i])<=eps)
{
top--;
}
seq[++top]=pl[i];
}
h=top;
for (i=n-;i>=;i--)
{
while (top>h && area(seq[top-],seq[top],pl[i])<=eps)
{
top--;
}
seq[++top]=pl[i];
}
top--;
/* for (i=0;i<=top;i++)
{
printf("(%d,%d)",seq[i].x,seq[i].y);
}*/
qword S=;
int x,y;
point tp;
tp.x=tp.y=;
for (i=;i<top;i++)
{
S+=area(seq[],seq[i],seq[(i+)%(top+)]);
}
qword A=;
for (i=;i<=top;i++)
{
x=seq[i].x-seq[(i+)%(top+)].x;
y=seq[i].y-seq[(i+)%(top+)].y;
x=abs(x);
y=abs(y);
if (!x)A+=y;
else if (!y) A+=x;
else A+=gcd(x,y);
}
//S=I+(A/2)-1
qword I;
I=(S-A+)/;
cout<<I+A<<endl;;
}

tyvj 1150 绳子围点 Pick定理 防溢出策略的更多相关文章

  1. UVa 10088 - Trees on My Island (pick定理)

    样例: 输入:123 16 39 28 49 69 98 96 55 84 43 51 3121000 10002000 10004000 20006000 10008000 30008000 800 ...

  2. poj1265Area(pick定理)

    链接  Pick定理是说,在一个平面直角坐标系内,如果一个多边形的顶点全都在格点上,那么这个图形的面积恰好就等于边界上经过的格点数的一半加上内部所含格点数再减一. pick定理的一些应用 题意不好懂, ...

  3. UVa 10088 (Pick定理) Trees on My Island

    这种1A的感觉真好 #include <cstdio> #include <vector> #include <cmath> using namespace std ...

  4. poj 1265 Area(pick定理)

    Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4373 Accepted: 1983 Description Bein ...

  5. [poj 1265]Area[Pick定理][三角剖分]

    题意: 给出机器人移动的向量, 计算包围区域的内部整点, 边上整点, 面积. 思路: 面积是用三角剖分, 边上整点与GCD有关, 内部整点套用Pick定理. S = I + E / 2 - 1 I 为 ...

  6. pick定理详解

    一.概念 假设P的内部有I(P)个格点,边界上有B(P)个格点,则P的面积A(P)为:A(P)=I(P)+B(P)/2-1. 二.说明 Pick定理主要是计算格点多边形(定点全是格点的不自交图形)P的 ...

  7. Pick定理、欧拉公式和圆的反演

    Pick定理.欧拉公式和圆的反演 Tags:高级算法 Pick定理 内容 定点都是整点的多边形,内部整点数为\(innod\),边界整点数\(ednod\),\(S=innod+\frac{ednod ...

  8. 几何:pick定理详解

    一.概念 假设P的内部有I(P)个格点,边界上有B(P)个格点,则P的面积A(P)为:A(P)=I(P)+B(P)/2-1. 二.说明 Pick定理主要是计算格点多边形(定点全是格点的不自交图形)P的 ...

  9. 格点多边形面积公式(Pick定理)的一个形象解释(转)

    Pick定理:如果一个简单多边形(以下称为“多边形”)的每个顶点都是直角坐标平面上的格点,则称该多边形为格点多边形.若一个面积为S的格点多边形,其边界上有a个格点,内部有b个格点,则S=a/2+b-1 ...

随机推荐

  1. linux shell less 命令---转

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  2. 三分钟学会缓存工具DiskLruCache

    DiskLruCache是一个十分好用的android缓存工具,我们可以从GitHub上下载其源码:https://github.com/JakeWharton/DiskLruCache DiskLr ...

  3. Windows2012中安装域控(DC) + SQL Server 2014 + TFS 2015

    安装域控(DC) 修改计算机名 修改固定IP 添加角色 选择“Role-based or feature-based installation” 选择本机 选择“Active Directory Do ...

  4. 父页面iframe自动适应子页面的宽高度

    <script type="text/javascript"> function load(){ parent.document.getElementById(&quo ...

  5. javascript moveTo() 函数

    moveTo-- 移动窗体左上角到相对于屏幕左上角的(x,y)点,当使用负数做为参数时会吧窗体移出屏幕的可视区域 moveTo,中文"移动到"的意思 引用网址:http://www ...

  6. js - get-the-value-from-the-url-parameter(可以在非模态对话框中使用)

    ref: http://stackoverflow.com/questions/979975/how-to-get-the-value-from-the-url-parameter 函数: funct ...

  7. [解答]对‘’未定义的引用 collect2: 错误: ld 返回 1

    写的makefile适用于32位,但是放到64位机器上make就有问题. 需要在makefile中gcc -o....的结尾加上-pthread,例如: bloomfilter.o: bloomfil ...

  8. TUXEDO管理命令总结

    tmboot  启动服务: 参数说明: -l  lmid 启动逻辑服务器名为lmcd服务器上的所有进程 -g grpname 启动GROUP名为grpname的所有进程 -i  srvid 启动SRV ...

  9. C# 键值对排序

    static void Main(string[] args) { SortedList sl = new SortedList(); sl.Add("001", "Za ...

  10. (转)应用内存优化之OnLowMemory&OnTrimMemory

    1.应用内存onLowMemory& onTrimMemory优化 onLowMemory& onTrimMemory简介:OnLowMemory是Android提供的API,在系统内 ...