GYM 101673 A - Abstract Art 多个一般多边形面积并
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 1e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); struct Point {
double x, y;
Point(double x = , double y = ) : x(x), y(y) { } };
typedef Point Vector;
int dcmp(double x) {
if(fabs(x) < eps) return ;
else return x < ? - : ;
}
Point operator + (Vector A, Vector B) {return Point(A.x + B.x, A.y + B.y);}
Point operator - (Vector A, Vector B) {return Point(A.x - B.x, A.y - B.y);}
Point operator * (Vector A, double p) {return Point(A.x * p, A.y * p);}
Point operator / (Vector A, double p) {return Point(A.x / p, A.y / p);}
bool operator < (const Vector &A, const Vector &B) {return A.y < B.y || (A.y == B.y && A.x < B.x);}
bool operator == (const Vector &A, const Point &B) {return dcmp(A.x - B.x) == && dcmp(A.y - B.y) == ;}
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;}
double Area2(Point A, Point B, Point C) {return Cross(B - A, C - A);} double PolygonArea(vector<Point>& p) {
int n = p.size();
double area = ;
for(int i = ; i < n - ; i++)
area += Cross(p[i]-p[], p[i+]-p[]);
return fabs(area / );
} double Seg(Point O, Point A, Point B){
if(dcmp(B.x - A.x) == ) return (O.y - A.y) / (B.y - A.y);
return (O.x - A.x) / (B.x - A.x);
} double MultiPolyArea(vector<Point>* p, int n) {
double res=;
vector<pair<double, int>> s;
for(int i = ; i < n; i++) {
int sz = p[i].size();
for(int j = ; j < sz; j++){
s.clear();
s.push_back(mk(, ));
s.push_back(mk(, ));
Point a = p[i][j], b = p[i][(j+)%sz];
for(int k = ; k < n; k++){
if(i != k){
int sz2 = p[k].size();
for(int z = ; z < sz2; z++){
Point c = p[k][z], d = p[k][(z+)%sz2];
int c1 = dcmp(Cross(b-a, c-a));
int c2 = dcmp(Cross(b-a, d-a));
if(c1 == && c2 == ) {
if(dcmp(Cross(b-a, d-c))) {
s.push_back(mk(Seg(c, a, b), ));
s.push_back(mk(Seg(c, a, b), -));
}
} else {
double s1 = Cross(d-c, a-c), s2 = Cross(d-c, b-c);
if(c1 >= && c2 < ) s.push_back(mk(s1/(s1-s2), ));
else if(c1 < && c2 >= ) s.push_back(mk(s1/(s1-s2), -));
}
}
}
}
sort(s.begin(), s.end());
double pre = min(max(s[].fi, 0.0), 1.0), now, sum=;
int cov = s[].se;
for(int j = ; j < s.size(); j++) {
now = min(max(s[j].fi, 0.0), 1.0);
if(!cov) sum += now - pre;
cov += s[j].second;
pre = now;
}
res += Cross(a, b) * sum;
}
}
return fabs(res / );
} int n, m;
vector<Point> poly[]; int main() {
scanf("%d", &n);
for(int i = ; i < n; i++) {
scanf("%d", &m);
poly[i].resize(m);
for(int j = ; j < m; j++) {
scanf("%lf%lf", &poly[i][j].x, &poly[i][j].y);
}
}
double ans1 = , ans2 = MultiPolyArea(poly, n);
for(int i = ; i < n; i++) ans1 += PolygonArea(poly[i]);
printf("%.12f %.12f\n", ans1, ans2);
return ;
} /*
*/
GYM 101673 A - Abstract Art 多个一般多边形面积并的更多相关文章
- Gym - 101673:B Craters (几何,求凸包)
题意:给定几个圆,求最短的围合,把这几个包围起来,而且到圆的距离都不小于10. 思路:把每个圆的半径+10,边等分5000份,然后求凸包即可. #include<bits/stdc++.h> ...
- Gym-101673: A Abstract Art (模板,求多个多边形的面积并)
手抄码板大法. #include<bits/stdc++.h> using namespace std; #define mp make_pair typedef long long ll ...
- Gym - 101208J 2013 ACM-ICPC World Finals J.Pollution Solution 圆与多边形面积交
题面 题意:给你一个半圆,和另一个多边形(可凹可凸),求面积交 题解:直接上板子,因为其实这个多边形不会穿过这个半圆,所以他和圆的交也就是和半圆的交 打的时候队友说凹的不行,不是板题,后面想想,圆与多 ...
- POJ 1279 Art Gallery 半平面交/多边形求核
http://poj.org/problem?id=1279 顺时针给你一个多边形...求能看到所有点的面积...用半平面对所有边取交即可,模版题 这里的半平面交是O(n^2)的算法...比较逗比.. ...
- POJ 1279 Art Gallery 半平面交 多边形的核
题意:求多边形的核的面积 套模板即可 #include <iostream> #include <cstdio> #include <cmath> #define ...
- Gerald is into Art
Gerald is into Art Gerald bought two very rare paintings at the Sotheby's auction and he now wants t ...
- Codeforces Round #313 (Div. 2)B.B. Gerald is into Art
B. Gerald is into Art Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/ ...
- CodeForces 560B Gerald is into Art
Gerald is into Art time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #313 (Div. 2) B. Gerald is into Art 水题
B. Gerald is into Art Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560 ...
随机推荐
- SQL——sql年龄段查询
select * from 表 p where p.gender <> '男' ) ) select * ) ) 查询出所有年龄在15~49岁的非男性的信息
- 未能加载文件或程序集System.Web.Http.WebHost
解决方案:只需要在项目的bin文件夹下放入下面三个dll. 将:C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies中的 ...
- 表单之input的样式修改
修改placeholder字体颜色 html5为input添加了原生的占位符属性placeholder,高级浏览器都支持这个属性,例如: <input type="text" ...
- 消息队列介绍和SpringBoot2.x整合RockketMQ、ActiveMQ 9节课
1.JMS介绍和使用场景及基础编程模型 简介:讲解什么是小写队列,JMS的基础知识和使用场景 1.什么是JMS: Java消息服务(Java Message Service),Java ...
- 同步sync 异步async
线程中 同步任务是串行队列,也就是按顺序执行. 同步任务:不会开辟新的线程,它是在当前线程执行的. dispatch 调度 GCD里面的函数都是以dispatch开头的. 同步任务 步骤: 1. ...
- Struts通配符映射
- SpringMVC的JSON数据交互(七)-@Response,@RestController,@RequestBody用法
1.@RequestBody (自动将请求的数据封装为对象) 作用: @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConve ...
- 对HUAWEI-ManagedProvisioning的一次不完整分析
分析思路 关注点1:AndroidManifest.xml是Android应用的入口文件,包含有APP服务的权限.广播和启动位置. 关注点2:涉及到修改系统的函数,setWifiEnabled().I ...
- MySQL— 基础
目录 一.MySQL概述 二.下载安装 三.数据库操作 四.数据表操作 五.表内容操作 一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracl ...
- Python中的exec、eval使用实例
Python中的exec.eval使用实例 这篇文章主要介绍了Python中的exec.eval使用实例,本文以简洁的方式总结了Python中的exec.eval作用,并给出实例,需要的朋友可以参考下 ...