Codeforces-GYM101873 G Water Testing 皮克定理
2024-09-06 10:54:55
题意:
给定一个多边形,这个多边形的点都在格点上,问你这个多边形里面包含了几个格点。
题解:
对于格点多边形有一个非常有趣的定理:
多边形的面积S,内部的格点数a和边界上的格点数b,满足如下结论:
2S=2a+b-2
证明不难,对于格点长方形显然成立,对于高度为1的直角三角形也显然成立,那么我们想象,把两个满足皮克定理的多边形,沿着它们的一个平行与格线的边拼起来,假设拼的这个边长度为k,这两个图形原来在这里各有k个边界格点,拼起来之后,这2k个边界格点,变成了2个边界格点,和k-2个内部格点,神奇吧!它们的面积还是符合皮克定理, 任何图形都可以用长方形和高为1的直角三角形这样拼起来,因此定理得证。
边界格点数用gcd求,面积用叉乘求。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int maxn=1e5+;
int n;
pll p[maxn];
inline ll gcd(ll m,ll n){return n?gcd(n,m%n):m;}
int main()
{
cin>>n;
for(int i=;i<n;i++) scanf("%lld%lld",&p[i].first,&p[i].second);
ll S2=, b=;
for(int i=;i<n;i++)
{
S2+=p[i].first*p[(i+)%n].second-p[i].second*p[(i+)%n].first;
b+=gcd(abs(p[i].first-p[(i+)%n].first),abs(p[i].second-p[(i+)%n].second));
}
cout<<(abs(S2)-b+)/<<endl;
}
最新文章
- 关于 bind 你可能需要了解的知识点以及使用场景
- WCF错误:413 Request Entity Too Large
- CG&;CAD resource
- (1)WinForm和WebForm
- bzoj4578: [Usaco2016 OPen]Splitting the Field
- Mysql 中bitwise对效率的影响??
- jmeter初识
- handsontable的核心方法
- Fragment 设置主题
- ASP.NET速度优化
- 本地phpstudy开发中apache可以用,nginx不可用,
- 修改Weblogic jdk版本
- python与mongodb的交互 增删改差
- linux系统做raid
- 钉钉消息通知机器人python版
- C语言之指针变量
- docker——数据管理
- .net 枚举(Enum)使用总结
- 【java基础】java集合之HashTable,HashSet,HashMap
- 两种 js下载文件的步骤
热门文章
- 使用JMeter进行http压力测试
- tomcat访问控制及站点部署
- 谷歌浏览器控制台出现 Unchecked runtime.lastError: The message port closed before a response was received. 的报错
- leetcode-158周赛-5224-掷筛子模拟
- 【JZOJ6409】困难的图论
- __new__构造方法
- __str__方法
- Download ubuntu Linux
- ElasticSearch再学习
- csp-s模拟测试93