意甲冠军:

给一些直。这架飞机被分成了很多这些线性块。每个块的需求面积封闭曲线图。

分析:

①我们应要求交点22的直线;

②每行上的交点的重排序,借此来离散一整行(正反两条边);

③对于连向一个点的几条线段,对它们进行极角排序,相邻的两条线段我们给它们之间连一条边,我们脑补一下应该能够知道如何能够保证逆时针连边;

④找循环,利用叉积求面积。

ps. vector的调试真心不爽…

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#define pb push_back
#include <utility>
#define fi first
#define se second
#define mp make_pair
#include <stack>
using namespace std;
const int MAXN = 100;
const int MAXE = MAXN*MAXN<<1;
const double eps = 1e-8;
typedef double DB; int n;
#define sqr(x) ((x)*(x))
struct pot
{
double x, y;
pot(double x = 0, double y = 0):x(x), y(y){}
inline double len() {return sqrt(sqr(x)+sqr(y));}
inline void read() {scanf("%lf%lf", &x, &y);}
inline pot unit()
{
double d = len();
return pot(x/d, y/d);
}
inline double ang() {return atan2(y, x);}
};
typedef pot vec;
struct Line
{
pot p;
vec v;
Line(){}
Line(pot p, vec v):p(p), v(v){}
}lines[MAXN];
vector<pot> points; struct Edge
{
int sz;
int head[MAXE], to[MAXE], ne[MAXE];
Edge()
{
sz = 0;
memset(head, -1, sizeof(head));
}
inline void add(int u, int v)
{
to[sz] = v;ne[sz] = head[u];
head[u] = sz++;
}
}E; int next[MAXE]; bool vis[MAXE]; vector<DB> ans; inline int dcmp(double x)
{
if(fabs(x) <= eps) return 0;
else return x>0?1:-1;
} inline pot operator + (const vec &a, const vec &b) {return vec(a.x+b.x, a.y+b.y);}
inline pot operator - (const vec &a, const vec &b) {return vec(a.x-b.x, a.y-b.y);}
inline double operator * (const vec &a, const vec &b) {return a.x*b.x+a.y*b.y;}
inline double operator ^ (const vec &a, const vec &b) {return a.x*b.y-a.y*b.x;}
inline pot operator * (const vec &a, double k) {return vec(a.x*k, a.y*k);}
inline pot operator / (const vec &a, double k) {return vec(a.x/k, a.y/k);}
inline bool operator < (const vec &a, const vec &b) {return dcmp(a.x-b.x) < 0 || (dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) < 0);}
inline bool operator == (const vec &a, const vec &b) {return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;} inline pot get_line_intersection(const pot &p, const vec &v, const pot &q, const vec &w)
{
vec u = p-q;
double t = (w^u)/(v^w);
return p+v*t;
} inline bool parallel(const Line &a, const Line &b) {return dcmp(a.v^b.v) == 0;} inline int get_pot_id(const pot &p) {return lower_bound(points.begin(), points.end(), p)-points.begin();} inline bool cmp(DB a, DB b) {return dcmp(a-b) == 0;} inline void init()
{
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
pot a, b;
a.read();b.read();
lines[i] = Line(a, b-a);
}
for(int i = 0; i < n; ++i)
for(int j = i+1; j < n; ++j)
if(!parallel(lines[i], lines[j]))
points.pb(get_line_intersection(lines[i].p, lines[i].v, lines[j].p, lines[j].v));
sort(points.begin(), points.end());
points.erase(unique(points.begin(), points.end()), points.end());
for(int i = 0; i < n; ++i)
{
vector<DB> nodes;
vec d = lines[i].v.unit();
for(int j = 0; j < n; ++j)
if(!parallel(lines[i], lines[j]))
{
pot inter = get_line_intersection(lines[i].p, lines[i].v, lines[j].p, lines[j].v);
nodes.pb((inter-lines[i].p)*d);
}
sort(nodes.begin(), nodes.end());
nodes.erase(unique(nodes.begin(), nodes.end(), cmp), nodes.end());
for(int j = 1, sz = nodes.size(); j < sz; ++j)
{
int a = get_pot_id(lines[i].p+d*nodes[j]);
int b = get_pot_id(lines[i].p+d*nodes[j-1]);
E.add(a, b);E.add(b, a);
}
}
memset(next, -1, sizeof(next));
for(int i = 0, sz = points.size(); i < sz; ++i)
{
vector<pair<DB, int> > PA;
for(int j = E.head[i]; j != -1; j = E.ne[j])
PA.pb(mp((points[E.to[j]]-points[i]).ang(), j));
sort(PA.begin(), PA.end());
for(int j = 0, sz = PA.size(); j < sz; ++j)
next[PA[(j+1)%sz].se^1] = PA[j].se;
}
} inline void work()
{
for(int i = 0; i < E.sz; ++i)
if(!vis[i])
{
stack<int> s;
int j = i;
do
{
if(!s.empty() && (s.top()^1) == j)
s.pop();
else s.push(j);
vis[j] = true;
j = next[j];
if(j == -1) break;
}while(!vis[j]);
if(i == j)
{
DB area = 0;
while(!s.empty())
{
area += (points[E.to[s.top()^1]]^points[E.to[s.top()]]);
s.pop();
}
area *= 0.5;
if(dcmp(area) > 0)
ans.pb(area);
}
}
} inline void print()
{
printf("%d\n", ans.size());
sort(ans.begin(), ans.end());
for(int i = 0, sz = ans.size(); i < sz; ++i)
printf("%.4lf\n", ans[i]);
} int main()
{
init();
work();
print();
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

sgu209: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. ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)

    POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...

  5. HDU 2202 计算几何

    最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

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

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

  7. ACM 计算几何中的精度问题(转)

    http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...

  8. Areas on the Cross-Section Diagram

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

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

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

随机推荐

  1. uvalive 6393(uva 1572) Self-Assembly 拓扑排序

    题意: 给出一些正方形,这些正方形的每一条边都有一个标号.这些标号有两种形式:1.一个大写字母+一个加减号(如:A+, B-, A-......), 2.两个0(如:00):这些正方形能够任意翻转和旋 ...

  2. stm32的ADC左右对齐

  3. 《JavaScript高级程序设计》笔记——第一章到第三章

    2019年,新年伊始,我打算好好重读一下<JavaScript高级程序设计>这本前端必备经典书.每天半小时. 以下内容摘自<JavaScript高级程序设计> 2019-2-1 ...

  4. (转)SQL Server 2012笔记分享-25:配置备份维护计划

    本文转自http://543925535.blog.51cto.com/639838/1427529 在日常的SQL维护中,有很多需要重复周期性去做的工作我们不太可能去手动操作完成,比如备份作业.重建 ...

  5. java并发之生产者消费者模型

    生产者和消费者模型是操作系统中经典的同步问题.该问题最早由Dijkstra提出,用以演示它提出的信号量机制. 经典的生产者和消费者模型的描写叙述是:有一群生产者进程在生产产品.并将这些产品提供给消费者 ...

  6. 幻灯展示jQuery插件supersized

    主要特性: 能够自动修改图片大小适合浏览器的页面大小 通过幻灯展示的循环背景可以动态加载并且可以设置变化方式 核心版本可以支持仅仅需要背景变化大小的需要 键盘导航 整合Flickr - 可以从用户,组 ...

  7. js进阶课程 12-9 jquery的事件对象event的方法有哪些?

    js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...

  8. 【u244】山地考察

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 地质学家们打算考察一片山区.这片山区可分成m*n的网格,每个网格都有唯一的海拔高度,山区外围的海拔高度 ...

  9. 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包

    前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) ...

  10. 【Debug】— C++ 表达式必须包含类类型

    错误一般发生在使用.进行访问时,原因可能在于: 你以为你定义了一个类对象,其实你是声明了一个函数,在编译器看来: 对类对象指针采用.的方式访问其成员变量: 也包括基本类型变量,错误地使用. int a ...