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. [rxjs] Shares a single subscription -- publish()

    If have an observable and you subscribe it twice, those tow subscritions have no connection. console ...

  2. PERFORMANCE_SCHEMA 详解

    http://keithlan.github.io/2015/07/17/22_performance_schema/ http://www.markleith.co.uk/ http://www.c ...

  3. linux内核分析系列--百度

    http://www.baidu.com/p/frsllzh http://www.baidu.com/p/%E9%98%BF%E4%BF%A1sxq

  4. android线程与线程池-----线程池(二)《android开发艺术与探索》

    android 中的线程池 线程池的优点: 1 重用线程池中的线程,避免了线程的创建和销毁带来的性能开销 2 能有效的控制最大并发数,避免大量线程之间因为喜欢抢资源而导致阻塞 3 能够对线程进行简单的 ...

  5. Linux命令后台执行技巧小结

    1.最简单的方法: command & 例如: top & 此时显示job编号和后台进程号 [] 2.正在运行的程序放入后台 Ctrl - Z 3.查看有哪些后台进程及状态 jobs ...

  6. 前后端分离--构建前端Mock Server--windows部署rap

    mock:模拟的,虚假的 mock server:模拟服务,模拟请求,模拟虚假数据 为了前后端更好的分工,接口文档是必须的,前后端都根据接口文档写代码,然后对接接口就行了. 但是,后端跟不上前端节奏, ...

  7. .NET多线程同步方法详解

    .NET多线程同步方法详解(一):自由锁(InterLocked) .NET多线程同步方法详解(二):互斥锁(lock) NET多线程同步方法详解(三):读写锁(ReadWriteLock) .NET ...

  8. jQuery Ajax(load,post,get,ajax)用法与详解

    今天看到群里面有网友们问到Jquery Ajax的(load,post,get,ajax)之间的区别,现在整理了一篇文章出来,希望可以帮到网友们,首先我们先来看一些简单的方法, 这些方法都是对jQue ...

  9. UITextField 对输入金额的约束

    [2016/1/18更新] -- 五个人辛辛苦苦干了一年的项目终于上线了,今天有空看了一下正则表达式教程,然后开始rebuild之前的种种对字符串的约束,首先就从这个金额输入框开始吧,修改后的代码如下 ...

  10. Eclipse反编译工具Jad及插件

    Eclipse反编译工具Jad及插件下载路径 http://download.csdn.net/detail/lijun7788/9689312 http://files.cnblogs.com/fi ...