据说pkusc出了好几年半平面交了,我也来水一发

ref

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n, cnt, tot;
const double eps=1e-7;
struct Point{
double x, y;
Point(double u=0.0, double v=0.0){
x = u; y = v;
}
Point operator+(const Point &u)const{
return Point(x+u.x, y+u.y);
}
Point operator-(const Point &u)const{
return Point(x-u.x, y-u.y);
}
double crs(Point u){
return x*u.y-y*u.x;
}
}pt[55], a[1005];
struct Line{
Point x, y;
double ang;
Line(){}
Line(Point u, Point v){
x = u; y = v;
ang = atan2(v.y-u.y, v.x-u.x);
}
}l[1005], d[1005];
Point operator*(double x, Point u){
return Point(x*u.x, x*u.y);
}
bool cmp(Line u, Line v){
if(fabs(u.ang-v.ang)>=eps) return u.ang<v.ang;
return (u.y-u.x).crs(v.y-u.x)>eps;
}
Point inter(Line u, Line v){
double t=(v.x-u.x).crs(v.y-u.x)/((v.x-u.x).crs(v.y-u.x)+(v.y-u.y).crs(v.x-u.y));
return u.x+t*(u.y-u.x);
}
bool isLeft(Point u, Line v){
return (v.y-v.x).crs(u-v.x)>eps;
}
void halfPlaneIntersection(){
sort(l+1, l+1+cnt, cmp);
for(int i=1; i<=cnt; i++){
if(i==1 || fabs(l[i].ang-l[i-1].ang)>=eps) tot++;
l[tot] = l[i];
}
cnt = tot; tot = 0;
int ll=1, rr=0;
d[++rr] = l[1]; d[++rr] = l[2];
for(int i=3; i<=cnt; i++){
while(ll<rr && !isLeft(inter(d[rr-1], d[rr]), l[i])) rr--;
while(ll<rr && !isLeft(inter(d[ll+1], d[ll]), l[i])) ll++;
d[++rr] = l[i];
}
while(ll<rr && !isLeft(inter(d[rr-1], d[rr]), d[ll])) rr--;
while(ll<rr && !isLeft(inter(d[ll+1], d[ll]), d[rr])) ll++;
d[rr+1] = d[ll];
for(int i=ll; i<=rr; i++)
a[++tot] = inter(d[i], d[i+1]);
}
double ans(){
if(tot<3) return 0.0;
a[tot+1] = a[1];
double re=0;
for(int i=1; i<=tot; i++)
re += a[i].crs(a[i+1]);
return re/2;
}
int main(){
cin>>n;
while(n--){
int mi;
scanf("%d", &mi);
for(int i=1; i<=mi; i++)
scanf("%lf %lf", &pt[i].x, &pt[i].y);
pt[mi+1] = pt[1];
for(int i=1; i<=mi; i++)
l[++cnt] = (Line){pt[i], pt[i+1]};
}
halfPlaneIntersection();
printf("%.3f\n", ans());
return 0;
}

luogu4196 [CQOI2006]凸多边形 半平面交的更多相关文章

  1. BZOJ2618[Cqoi2006]凸多边形——半平面交

    题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...

  2. 【bzoj2618】[Cqoi2006]凸多边形 半平面交

    题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...

  3. bzoj2618[Cqoi2006]凸多边形 半平面交

    这是一道半平面交的裸题,第一次写半平面交,就说一说我对半平面交的理解吧. 所谓半平面交,就是求一大堆二元一次不等式的交集,而每个二元一次不等式的解集都可以看成是在一条直线的上方或下方,联系直线的标准方 ...

  4. P4196 [CQOI2006]凸多边形 半平面交

    \(\color{#0066ff}{题目描述}\) 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. \(\color{#0066f ...

  5. POJ3525 半平面交

    题意:求某凸多边形内部离边界最远的点到边界的距离 首先介绍半平面.半平面交的概念: 半平面:对于一条有向直线,它的方向的左手侧就是它所划定的半平面范围.如图所示: 半平面交:多个半平面的交集.有点类似 ...

  6. bzoj 4445 小凸想跑步 - 半平面交

    题目传送门 vjudge的快速通道 bzoj的快速通道 题目大意 问在一个凸多边形内找一个点,连接这个点和所有顶点,使得与0号顶点,1号顶点构成的三角形是最小的概率. 假设点的位置是$(x, y)$, ...

  7. 【kuangbin专题】计算几何_半平面交

    1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...

  8. bzoj 3190 赛车 半平面交

    直接写的裸的半平面交,已经有点背不过模板了... 这题卡精度,要用long double ,esp设1e-20... #include<iostream> #include<cstd ...

  9. BZOJ 4445 [Scoi2015]小凸想跑步:半平面交

    传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...

随机推荐

  1. win2008 配置TLS1.2

    配置TLS1.2 提供两种方法, 选择其中一种就行了 1.手动设置 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProv ...

  2. C#WinFrom写的拼图游戏

    1.窗口载入时自动生成拼图按钮 ;//按钮的行.列数 Button[,] buttons = new Button[N, N];//按钮的数组 ;//记录步数 private void Form3_L ...

  3. window下编译ffmpeg

    网上关于编译ffmpeg的帖子很多,我也尝试了很多次,但是很多都过不了,一部分原因是版本问题,还有就是有的路劲没说的太明白导致的,经过一天的摸索,最终编译好了,下面把编译方式写下来,希望对看到帖子的人 ...

  4. jrtplib源码分析 第一篇 jthread的编译与分析

    第一篇 jthread的编译与分析 jrtplib代码依赖库jthread,因此先从jthread开始jrtplib的学习.首先从以下链接下载jthread的源代码http://research.ed ...

  5. InnoDB多版本(MVCC)实现简要分析

    转载自:http://hedengcheng.com/?p=148 基本知识 假设对于多版本(MVCC)的基础知识,有所了解.InnoDB为了实现多版本的一致读,采用的是基于回滚段的协议. 行结构 I ...

  6. POJ - 3109 Inner Vertices

    不存在-1的情况,而且最多一轮就结束了.如果新增加的黑点v0会产生新的黑点v1,那么v0和v1肯定是在一条轴上的,而原来这条轴上已经有黑点了. 离散以后扫描线统计,往线段上插点,然后查询区间上点数. ...

  7. 【BZOJ5084】hashit(后缀自动机水过)

    点此看题面 大致题意: 每次在字符串后面加入或删除一个字符,求本质不同的子串个数. 后缀自动机 先说明,此题后缀自动机的确能过. 但我的后缀自动机比较弱,遇上一个较强的\(Hack\)数据就被卡掉了. ...

  8. 【转】你是不是也被Android Private Libraries、Referenced Libraries、android Dependency搞晕了~~

    一.v4.v7.v13的作用和用法 1.Android Support V4, V7, V13是什么? 本质上就是三个java library. 2.为什么要有support库?   是为了解决软件的 ...

  9. JavaEE权限管理系统的搭建(二)--------聚合工程项目的创建和依赖关系

    本项目是一个聚合工程,所以要先搭建一个聚合工程的框架 搭建完成的项目结构图如下: 首先创建父项目:pom类型 子模块:web层的搭建,war类型 把这个两个目录标记为对应的类型 其他子模块:和serv ...

  10. Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-9enuqi/MySQL-python/

    hu@hu-VirtualBox:/home/newdisk/telnet-scanner$ sudo pip install MySQL-python[sudo] hu 的密码: The direc ...