SGU 209. Areas
209. Areas
memory limit per test: 65536 KB
output: standard
Your task in this problem is for each finite part to find its area.
All coordinates do not exceed 102 by their absolute value.
No two lines coincide.
Next K lines of the output file must contain area parts sorted in non-decreasing order. You answer must be accurate up to 10-4.
Due to floating point precision losses possible, do not consider parts with area not exceeding 10-8.
0 0 1 0
1 0 1 1
1 1 0 1
0 1 0 0
0 0 1 1
0.5000
0.5000
题意
求平面上一堆直线围成的所有封闭多边形面积。
ID: | Date'n'Time: | Name: | Task: | .Ext: | Status: | Time: | Memory: |
1587815 | 27.08.14 15:40 | HuZhifeng | 209 | .CPP | Accepted | 15 ms | 458 kb |
1587814 | 27.08.14 15:00 | HuZhifeng | 209 | .CPP | Wrong answer on test 12 | 15 ms | 554 kb |
1587813 | 27.08.14 14:55 | HuZhifeng | 209 | .CPP | Memory Limit Exceeded on test 12 | 218 ms | 99406 kb |
1587812 | 27.08.14 14:53 | HuZhifeng | 209 | .CPP | Runtime Error on test 12 | 15 ms | 378 kb |
#include <bits/stdc++.h>
#define rep(_i, _j) for(int _i = 1; _i <= _j; ++_i)
const int inf = 0x3f3f3f3f;
typedef long long LL;
typedef double DB;
using namespace std;
/*{ 基本定义,二维点,向量,叉积,点积,基本运算。*/ const DB eps = 1e-;
#define sqr(x) ((x) * (x))
int dcmp(DB x) {
return x < -eps ? - : eps < x;
}
bool chk_equality(DB x, DB y) {
return dcmp(x - y) == ;
} struct Point {
DB x, y;
Point() {}
Point(DB x, DB y): x(x), y(y) {}
DB arg() {
return atan2(y, x);
}
DB norm() {
return sqrt(sqr(x) + sqr(y));
}
Point normalize() {
DB d = norm();
return Point(x / d, y / d);
}
void read() {
scanf("%lf%lf", &x, &y);
}
};
typedef Point Vector;
bool operator == (const Point a, const Point b) {
return dcmp(a.x - b.x) == && dcmp(a.y - b.y) == ;
}
bool operator < (const Point a, const Point b) {
return dcmp(a.x - b.x) < || (dcmp(a.x - b.x) == && dcmp(a.y - b.y) < );
}
Vector operator + (Point a, Point 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 v, DB p) {
return Vector(v.x * p, v.y * p);
}
Vector operator / (Vector v, DB p) {
return Vector(v.x / p, v.y / p);
}
DB dot(Vector a, Vector b) {
return a.x * b.x + a.y * b.y;
}
DB cross(Vector a, Vector b) {
return a.x * b.y - a.y * b.x;
}
DB length(Vector a) {
return sqrt(dot(a, a));
} /*} end*/ struct Line {
Point p;
Vector d;
Line() {}
Line(Point p, Vector d): p(p), d(d) {}
};
bool operator == (Line a, Line b) {
return a.p == b.p && dcmp(cross(a.d, b.d)) == ;
}
/*{ 常用函数*/ Point get_intersection(Line a, Line b) {
DB s1 = cross(a.p - b.p, b.d);
DB s2 = cross(a.p + a.d - b.p, b.d);
return (a.p * s2 - (a.p + a.d) * s1) / (s2 - s1);
} /*} end*/ const int maxn = + ; int n;
Line lines[maxn];
Point tmp1, tmp2;
vector<Point> points;
int get_point_id(Point a) {
return lower_bound(points.begin(), points.end(), a) - points.begin();
}
const int maxv = maxn;
const int maxe = maxv * maxv * ;
struct Edge {
int edge;
int head[maxe], to[maxe], next[maxe];
Edge() {
edge = ;
memset(head, -, sizeof head);
}
void addedge(int u, int v) {
to[edge] = v;
next[edge] = head[u];
head[u] = edge++;
}
} E;
int next[maxe];
bool vis[maxe]; int main() {
#ifndef ONLINE_JUDGE
freopen("209.in", "r", stdin); freopen("209.out", "w", stdout);
#endif
cin >> n;
for(int i = ; i < n; ++i) {
tmp1.read(), tmp2.read();
lines[i] = Line(tmp1, tmp2 - tmp1);
}
for(int i = ; i < n; ++i) {
for(int j = ; j < i; ++j) {
if(!chk_equality(cross(lines[i].d, lines[j].d), )) {
points.push_back(Point(get_intersection(lines[i], lines[j])));
}
}
}
sort(points.begin(), points.end());
points.erase(unique(points.begin(), points.end()), points.end());
for(int i = ; i < n; ++i) {
vector<DB> lambdas;
Vector d = lines[i].d.normalize();
for(int j = ; j < n; ++j) {
if(!chk_equality(cross(d, lines[j].d), )) {
lambdas.push_back(dot(get_intersection(lines[i], lines[j]) - lines[i].p, d));
}
}
sort(lambdas.begin(), lambdas.end());
lambdas.erase(unique(lambdas.begin(), lambdas.end(), chk_equality), lambdas.end());
for(int j = , sz = lambdas.size(); j < sz; ++j) {
int a = get_point_id(lines[i].p + d * lambdas[j]);
int b = get_point_id(lines[i].p + d * lambdas[j - ]);
E.addedge(b, a);
E.addedge(a, b);
}
}
memset(next, -, sizeof next);
for(int i = , sz = points.size(); i < sz; ++i) {
vector<pair<DB, int> > adjacent;
for(int j = E.head[i]; j != -; j = E.next[j]) {
adjacent.push_back(make_pair((points[E.to[j]] - points[i]).arg(), j));
}
sort(adjacent.begin(), adjacent.end());
for(int j = , sz = adjacent.size(); j < sz; ++j) {
next[adjacent[(j + ) % sz].second ^ ] = adjacent[j].second;
}
}
memset(vis, false, sizeof vis);
vector<DB> areas;
for(int i = ; i < E.edge; ++i) {
if(!vis[i]) {
vector<int> boundary;
int j = i;
do {
if(!boundary.empty() && (boundary.back() ^ j) == ) {
boundary.pop_back();
} else {
boundary.push_back(j);
}
vis[j] = true;
j = next[j];
} while(!vis[j]);
if(i == j) {
DB area = 0.0;
for(int k = , sz = boundary.size(); k < sz; ++k) {
area += cross(points[E.to[boundary[k] ^ ]], points[E.to[boundary[k]]]);
}
area /= 2.0;
if(dcmp(area) > ) {
areas.push_back(area);
}
}
}
}
sort(areas.begin(), areas.end());
printf("%d\n", (int)areas.size());
for(int i = , sz = areas.size(); i < sz; ++i) {
printf("%.4lf\n", areas[i]);
}
return ;
}
SGU 209. Areas的更多相关文章
- ASP.NET Core 中文文档 第四章 MVC(4.6)Areas(区域)
原文:Areas 作者:Dhananjay Kumar 和 Rick Anderson 翻译:耿晓亮(Blue) 校对:许登洋(Seay) Areas 是 ASP.NET MVC 用来将相关功能组织成 ...
- 【无私分享:ASP.NET CORE 项目实战(第九章)】创建区域Areas,添加TagHelper
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在Asp.net Core VS2015中,我们发现还有很多不太简便的地方,比如右击添加视图,转到试图页等功能图不见了,虽然我 ...
- ASP.NET MVC Routing、Areas、URLs
webForm页面运行起来url一般是这样的:localhost:****/index.aspx,这个过程就是当你运行页面的时候,vs开发工具自带的微型服务器会打开你存在硬盘上的这个文件然后显示在浏览 ...
- [转]【无私分享:ASP.NET CORE 项目实战(第九章)】创建区域Areas,添加TagHelper
本文转自:http://www.cnblogs.com/zhangxiaolei521/p/5808417.html 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在Asp ...
- Areas on the Cross-Section Diagram
Areas on the Cross-Section Diagram Aizu - ALDS1_3_D Areas on the Cross-Section Diagram 地域の治水対策として.洪 ...
- Asp.Net Mvc Areas 的用法与好处
前言 在项目中为什么要使用Areas 进行分离 大家都知道,一般的Web应用都有前台(面向用户)和后台(面向管理员)两部分,我们希望以/localhost/Admin 开始的Url 是用户的后台管理地 ...
- SGU 495. Kids and Prizes
水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...
- ACM: SGU 101 Domino- 欧拉回路-并查集
sgu 101 - Domino Time Limit:250MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u Desc ...
- 【SGU】495. Kids and Prizes
http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:N个箱子M个人,初始N个箱子都有一个礼物,M个人依次等概率取一个箱子,如果有礼物则 ...
随机推荐
- [转]从头开始 GAN
1 前言 GAN的火爆想必大家都很清楚了,各种GAN像雨后春笋一样冒出来,大家也都可以名正言顺的说脏话了[微笑脸].虽然目前GAN的酷炫应用还集中在图像生成上,但是GAN也已经拓展到NLP,Robot ...
- js 多个事件的绑定及移除(包括原生写法和 jquery 写法)
需要打开控制台查看效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 2018-2019, ICPC, Asia Yokohama Regional Contest 2018 K
传送门:https://codeforces.com/gym/102082/attachments 题解: 代码: /** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ...
- XFire搭建WebService和客户端访问程序
开发环境:myeclipse8.6+jdk1.6.0_29+tomcat6.0.37 JAX-WS搭建webservice:http://www.cnblogs.com/gavinYang/p/352 ...
- 很好的脑洞题:dfs+暴力 Gym - 101128A Promotions
http://codeforces.com/gym/101128 题目大意:给你一个a,b,e,p.有e个点,p条有向边,每条边为(x,y),表示x->y,每次我们都取出一个入度为0的,并且一次 ...
- Do the Untwist(模拟)
ZOJ Problem Set - 1006 Do the Untwist Time Limit: 2 Seconds Memory Limit: 65536 KB Cryptography ...
- 【BZOJ】2331: [SCOI2011]地板 插头DP
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...
- 【leetcode 简单】第三十七题 相交链表
编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: 如果两个 ...
- 使用chardet判断编码方式
1. chardet是什么 chardet是python中比较常用的一个编码方式检测库,需要注意的是它只检测并返回检测结果,并不负责对原数据做什么处理. 可以使用PIP命令安装: pip instal ...
- 绿色的银行类cms管理系统模板——后台
链接:http://pan.baidu.com/s/1pK7Vu9X 密码:4cc5