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 ...
随机推荐
- Hibernate_day01
一.今天内容介绍 1 web内容回顾 (1)javaee三层结构 (2)mvc思想 2 hibernate概述 3 hibernate入门案例 4 hibernate配置文件 5 hibernate的 ...
- Java SE之反射技术[Field](二)
如果对于反射的基本概念还不了解的请见上一帖子.本文仅谈fields的用法demo /** * * @author Zen Johnny * */ package com.cpms.test; impo ...
- spoj gss1 gss3
传送门 gss1 gss3 spoj gss系列=最大字段和套餐 gss1就是gss3的无单点修改版 有区间查询和单点修改,考虑用线段树维护 我们要维护区间权值和\(s\),区间最大前缀和\(xl\) ...
- F - 回转寿司 (权值线段树)
题目链接:https://cn.vjudge.net/contest/281960#problem/F 题目大意:中文题目 具体思路:权值线段树,我们每次寻找的是满足 (i<j) L< ...
- android当前网络连接类型判断
package net.nyist.netState; import android.content.Context; import android.net.ConnectivityManager; ...
- spring-framework-x.x.x.RELEASE-dist下载教程
1.打开Spring官网:https://spring.io,点击PROJECTS 2.点击SPRING FRAMEWORK 3.点击GitHub图标 4.找到Access to Binaries,点 ...
- java删除文件及其目录
1.删除指定文件路径 public @ResponseBody String deleteFiles(HttpServletRequest request) { log.info(this.getCl ...
- python cookbook 笔记二
去重和排序: #coding=utf-8 def dedupe(items): seen = set() for item in items: if item not in seen: yield i ...
- 【逆向知识】GitHub:Awesome-Hacking(黑客技能列表-逆向)
0 初衷 GitHub这一份黑客技能列表很不错,包含了多个方向的安全.但目前我关注只有逆向工程与恶意代码,所以其他的被暂时略过. 虽然很感谢作者的辛勤付出,但并不打算复制粘贴全套转载.逐条整理是为了从 ...
- MR室内室外用户区分
mro_view_details_year中v3字段 1:室外用户 0:室内用户 主小区是室内站 主小区信号>-90dBm ==> 室内 主小区信号>-100dBm &&am ...