LA 3263 (欧拉定理)
欧拉定理题意: 给你N 个点,按顺序一笔画完连成一个多边形
求这个平面被分为多少个区间
欧拉定理 : 平面上边为 n ,点为 c 则 区间为 n + 2 - c;
思路: 先扫,两两线段的交点,存下来,有可能会有重复点, 用STL unique 去重
在把每个点判断是否在线段上,有,则会多出一条线段(不包括端点的点)
这样就得出结果了 O(n * n ) /// 这题还有点卡精度, 1e-11 WA, 1e-9 A了…….
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
const int maxn = 300 +31;
const double eps = 1e-9;
struct Point {
double x, y;
Point(double x = 0,double y = 0) : x(x), y(y) {}
}; int dcmp(double x) { if(fabs(x) < eps) return 0 ; else return x < 0 ? -1 : 1; } typedef Point Vector;
Vector operator + (Vector A, Vector B) { return Vector(A.x+B.x, A.y+B.y); }
Vector operator - (Point A, Point B) { return Vector(A.x-B.x, A.y-B.y); }
Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p ); }
Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p ); }
bool operator < (const Point &a, const Point &b) { return a.x < b.x || (a.x==b.x && a.y < b.y); }
bool operator == (const Point &a, const Point &b) {
return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;
} double Dot (Vector A, Vector B) { return A.x*B.x + A.y*B.y; }
double Length (Vector A) { return sqrt(Dot(A,A)); }
double Angle (Vector A, Vector B) { return acos(Dot(A,B) / Length(A) / Length(B)) ;}
double Cross (Vector A, Vector B) { return A.x*B.y - A.y*B.x; } Point GetLineIntersection (Point P, Vector v, Point Q, Vector w) { ///求直线焦点
Vector u = P - Q;
double t = Cross(w, u) / Cross(v, w);
return P + v*t;
}
bool SegmentProperIntersection (Point a1, Point a2, Point b1, Point b2) { /// 判断两线段是否相交 (不包括端点)
double c1 = Cross(a2-a1,b1-a1), c2 = Cross(a2-a1,b2-a1),
c3 = Cross(b2-b1,a1-b1), c4 = Cross(b2-b1,a2-b1);
return dcmp(c1)*dcmp(c2) < 0 && dcmp(c3)*dcmp(c4) < 0;
}
bool OnSegment (Point p, Point a1, Point a2) { /// 判断点是否在线段上(不包括端点)
return dcmp(Cross(a1-p,a2-p)) == 0 && dcmp(Dot(a1-p, a2-p)) < 0;
} Point P[maxn], V[maxn*maxn]; int main()
{
int n,kase = 1;
while( cin >> n && n )
{
for(int i = 0; i < n; ++i)
{
cin >> P[i].x >> P[i].y;
V[i] = P[i];
}
n--;
int c = n;
for(int i = 0; i < n; ++i)
{
for(int j = i+1; j < n; ++j)
if(SegmentProperIntersection(P[i],P[i+1],P[j],P[j+1]))
V[c++] = GetLineIntersection(P[i],P[i+1]-P[i],P[j],P[j+1]-P[j]);
}
sort(V,V+c);
c = unique(V,V+c) - V;///顶点个数
int e = n;///边
for(int i = 0; i < c; ++i)
{
for(int j = 0; j < n; ++j)
if(OnSegment(V[i],P[j],P[j+1])) e++;
}
int sum = e+2-c;
//if(sum == 1) printf("Case %d: There are %d piece.\n",kase++,sum);
printf("Case %d: There are %d pieces.\n",kase++,sum);
}
return 0;
}
LA 3263 (欧拉定理)的更多相关文章
- LA 3263 /// 欧拉定理 oj21860
题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...
- LA 3263 欧拉定理
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
题意: 平面上有n个端点的一笔画,最后一个端点与第一个端点重合,即所给图案是闭合曲线.求这些线段将平面分成多少部分. 分析: 平面图中欧拉定理:设平面的顶点数.边数和面数分别为V.E和F.则 V+F- ...
- LA 3263 That Nice Euler Circuit(欧拉定理)
That Nice Euler Circuit Little Joey invented a scrabble machine that he called Euler, after the grea ...
- 简单几何(求划分区域) LA 3263 That Nice Euler Circuit
题目传送门 题意:一笔画,问该图形将平面分成多少个区域 分析:训练指南P260,欧拉定理:平面图定点数V,边数E,面数F,则V + F - E = 2.那么找出新增的点和边就可以了.用到了判断线段相 ...
- LA 3263 平面划分
Little Joey invented a scrabble machine that he called Euler, after the great mathematician. In his ...
- POJ 2284 That Nice Euler Circuit (LA 3263 HDU 1665)
http://poj.org/problem?id=2284 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&a ...
- LA 3263 好看的一笔画 欧拉几何+计算几何模板
题意:训练指南260 #include <cstdio> #include <cstring> #include <algorithm> #include < ...
- UVAlive 3263 That Nice Euler Circuit(欧拉定理)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21363 [思路] 欧拉定理:V+F-E=2.则F=E-V+2. 其 ...
随机推荐
- C# Serializable
System.SerializableAttribute 串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原 ...
- mysql驱动参数变化
在java平台使用的mysql jdbc驱动为:mysql-connector-java. 在项目中添加如下依赖: <dependency> <groupId>mysql< ...
- 利用C#访问注册表获取软件的安装路径
文章地址:https://blog.csdn.net/yl2isoft/article/details/17332139
- Web服务调试可用,发布之后访问出错
今天重装了系统,然后发现之前的Web服务DataService不能用了.将其设置为启动项,运行的结果是 跟踪发现,是mysql.data.dll的版本不对.所以要找到所有版本不对的该dll,将其替换成 ...
- 使用二分查找判断某个数在某个区间中--如何判断某个IP地址所属的地区
一,问题描述 给定100万个区间对,假设这些区间对是互不重叠的,如何判断某个数属于哪个区间? 首先需要对区间的特性进行分析:区间是不是有序的?有序是指:后一个区间的起始位置要大于前一个区间的终点位置. ...
- 12.scrapy框架
一.Scrapy 框架简介 1.简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个 ...
- 【noip 2012】提高组Day2T3.疫情控制
Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...
- faster rcnn 做识别
faster rcnn 主要分为四个部分: 1. convolutional part: 特征提取 可以使用vgg,resnet 等等 2.region proposal network: 生成 re ...
- 「PKUWC 2018」Minimax
传送门:Here 一道线段树合并好题 如果要维护点$ x$的信息,相当于合并$ x$的两棵子树 对于这题显然有:任何叶子节点的权值都可能出现在其祖先上 因而我们只需要在线段树合并的时候维护概率即可 我 ...
- Mysql大文本类型
TEXT 一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符. MEDIUMTEXT 一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符. LONGTEXT ...