209. Areas

time limit per test: 0.25 sec.
memory limit per test: 65536 KB
input: standard
output: standard
Consider N different lines on the plane. They divide it to several parts,some of which are finite, some infinite.

Your task in this problem is for each finite part to find its area.

Input
The first line of the input file contains N — the number of lines (1 ≤ N ≤ 80). Each of next N lines contains four integer numbers x1, y1, x2 and y2 — the coordinates of two different points of the line.

All coordinates do not exceed 102 by their absolute value.

No two lines coincide.

Output
First output K — the number of finite parts among those the lines divide the plane to.

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

Sample test(s)
Input
 
 

0 0 1 0 
1 0 1 1 
1 1 0 1 
0 1 0 0 
0 0 1 1 
 
 
Output
 
 

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
又RE又ME又WA。。太爽啦!
 
坑爹题啊!
copy叉姐的。。。不忍直视。
 
#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的更多相关文章

  1. ASP.NET Core 中文文档 第四章 MVC(4.6)Areas(区域)

    原文:Areas 作者:Dhananjay Kumar 和 Rick Anderson 翻译:耿晓亮(Blue) 校对:许登洋(Seay) Areas 是 ASP.NET MVC 用来将相关功能组织成 ...

  2. 【无私分享:ASP.NET CORE 项目实战(第九章)】创建区域Areas,添加TagHelper

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在Asp.net Core VS2015中,我们发现还有很多不太简便的地方,比如右击添加视图,转到试图页等功能图不见了,虽然我 ...

  3. ASP.NET MVC Routing、Areas、URLs

    webForm页面运行起来url一般是这样的:localhost:****/index.aspx,这个过程就是当你运行页面的时候,vs开发工具自带的微型服务器会打开你存在硬盘上的这个文件然后显示在浏览 ...

  4. [转]【无私分享:ASP.NET CORE 项目实战(第九章)】创建区域Areas,添加TagHelper

    本文转自:http://www.cnblogs.com/zhangxiaolei521/p/5808417.html 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在Asp ...

  5. Areas on the Cross-Section Diagram

    Areas on the Cross-Section Diagram  Aizu - ALDS1_3_D Areas on the Cross-Section Diagram 地域の治水対策として.洪 ...

  6. Asp.Net Mvc Areas 的用法与好处

    前言 在项目中为什么要使用Areas 进行分离 大家都知道,一般的Web应用都有前台(面向用户)和后台(面向管理员)两部分,我们希望以/localhost/Admin 开始的Url 是用户的后台管理地 ...

  7. SGU 495. Kids and Prizes

    水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...

  8. ACM: SGU 101 Domino- 欧拉回路-并查集

    sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Desc ...

  9. 【SGU】495. Kids and Prizes

    http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:N个箱子M个人,初始N个箱子都有一个礼物,M个人依次等概率取一个箱子,如果有礼物则 ...

随机推荐

  1. 2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) F 区间dp

    Problem F Removal GameBobby Roberts is totally bored in his algorithms class, so he’s developed a li ...

  2. 手脱EXE32Pack v1.39

    1.PEID查壳 EXE32Pack v1.39 2.载入OD,先F8跟一下 0040A00C > 3BC0 cmp eax,eax ; //程序入口点 0040A00E je short st ...

  3. 「电脑应用」在mac上使用aria2

    Chrome 一. 需要工具: Chrome浏览器,Aria2GUI,Chrome里BaiduExporter插件. 首先先明确一件事情,平时生活中使用的所有工具都建议到官方下载,此处用到的几样提供给 ...

  4. 「Python」python-nmap安装与入门

    1.安装namp https://nmap.org/download.html 下载链接 PS:windows安装似乎麻烦一些,需要多下载npcap,官网有链接 2.python安装 注意,注意,注意 ...

  5. js返回上一页的实现方法

    下面是常用代码: <a href="<a href="javascript :history.back(-1)">返回上一页</a> < ...

  6. springsecurity basic 认证

    Basic Access Authentication scheme是在HTTP1.0提出的认证方法,它是一种基于challenge/response的认证模式,针对特定的realm需要提供用户名和密 ...

  7. poi对word的操作(总结)

    ★★★ POI在读写word docx文件时是通过xwpf模块来进行的,其核心是XWPFDocument.    1.正文段落:一个文档包含多个段落Paragraph,一个段落包含多个Runs,一个R ...

  8. CS46 C 枚举二分

    给你n*2个数其中n个数是原数减去了X值的数.问你满足条件的X值和原来的n个数.注意X为正整数. X should be positive,没0的 思路很简单,一个数必定会对应一个数,那么枚举一个数和 ...

  9. React Native 入门笔记一 -- Windows下基本环境配置

    一.准备工作 首先,需要安装nodejs,可以从nodejs官网下载,注意,React Native 要求node版本在4.0或以上:否则会出错,我建议把node版本升到最新版本,防止后面出现各种莫名 ...

  10. 如何修改 winserver2008 密码策略为简单密码

    对于不在域中的计算机, 可以运行: gpedit.msc , 如下图: 对于在域中的计算机, 应该: 如不能生效, 可重启再试.