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. [转]从头开始 GAN

    1 前言 GAN的火爆想必大家都很清楚了,各种GAN像雨后春笋一样冒出来,大家也都可以名正言顺的说脏话了[微笑脸].虽然目前GAN的酷炫应用还集中在图像生成上,但是GAN也已经拓展到NLP,Robot ...

  2. js 多个事件的绑定及移除(包括原生写法和 jquery 写法)

    需要打开控制台查看效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  3. 2018-2019, ICPC, Asia Yokohama Regional Contest 2018 K

    传送门:https://codeforces.com/gym/102082/attachments 题解: 代码: /** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ...

  4. XFire搭建WebService和客户端访问程序

    开发环境:myeclipse8.6+jdk1.6.0_29+tomcat6.0.37 JAX-WS搭建webservice:http://www.cnblogs.com/gavinYang/p/352 ...

  5. 很好的脑洞题:dfs+暴力 Gym - 101128A Promotions

    http://codeforces.com/gym/101128 题目大意:给你一个a,b,e,p.有e个点,p条有向边,每条边为(x,y),表示x->y,每次我们都取出一个入度为0的,并且一次 ...

  6. Do the Untwist(模拟)

    ZOJ Problem Set - 1006 Do the Untwist Time Limit: 2 Seconds      Memory Limit: 65536 KB Cryptography ...

  7. 【BZOJ】2331: [SCOI2011]地板 插头DP

    [题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...

  8. 【leetcode 简单】第三十七题 相交链表

    编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: 如果两个 ...

  9. 使用chardet判断编码方式

    1. chardet是什么 chardet是python中比较常用的一个编码方式检测库,需要注意的是它只检测并返回检测结果,并不负责对原数据做什么处理. 可以使用PIP命令安装: pip instal ...

  10. 绿色的银行类cms管理系统模板——后台

    链接:http://pan.baidu.com/s/1pK7Vu9X 密码:4cc5