嘟嘟嘟




本来我要写feng shui这道题的。然后网上都说什么半平面相交,于是我还得现学这个东西,就来刷这道模板题了。




所谓的半平面相交和高中数学的分数规划特别像。比如这道题,把每一条边看成一条有向直线,则合法的范围都是直线的右半部分,最后求交集。大概是每一次都取一半,所以就叫半平面相交吧。




\(O(n ^ 2)\)的做法很简单,我也只会\(O(n ^ 2)\)的。枚举每一条边,然后用这条边去切当前算出来的图形。

具体怎么切?一句话就是把这条直线左边的点全部扔掉。

放个伪代码就明白了:

for 每条边ai ai+1
if (ai在AB右边)
把ai加入答案
if (ai+1在AB左边) 把交点加入答案
else if(ai+1在AB右边) 把交点加入答案

至于判断左右,用叉积求又向面积就行了。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 5e5 + 5;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) {last = ch; ch = getchar();}
while(isdigit(ch)) {ans = (ans << 1) + (ans << 3) + ch - '0'; ch = getchar();}
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int n, m, cnt = 0;
struct Point
{
db x, y;
Point operator - (const Point& oth)const
{
return (Point){x - oth.x, y - oth.y};
}
db operator * (const Point& oth)const
{
return x * oth.y - oth.x * y;
}
Point operator * (const db& d)const
{
return (Point){x * d, y * d};
}
}p[maxn], a[maxn]; int tot = 0;
Point b[maxn];
db cross(Point A, Point B, Point C)
{
return (B - A) * (C - A);
}
void addCross(Point A, Point B, Point C, Point D)
{
db s1 = (C - A) * (D - A), s2 = (D - B) * (C - B);
b[++tot] = A - (A - B) * (s1 / (s1 + s2));
}
void cut(Point A, Point B)
{
tot = 0;
a[cnt + 1] = a[1];
for(int i = 1; i <= cnt; ++i)
{
if(cross(A, B, a[i]) >= 0)
{
b[++tot] = a[i];
if(cross(A, B, a[i + 1]) < 0) addCross(A, B, a[i], a[i + 1]);
}
else if(cross(A, B, a[i + 1]) > 0) addCross(A, B, a[i], a[i + 1]);
}
for(int i = 1; i <= tot; ++i) a[i] = b[i];
cnt = tot;
} int main()
{
n = read(); m = read();
for(int i = 1; i <= m; ++i) a[i].x = read(), a[i].y = read();
cnt = m; n--;
while(n--)
{
m = read();
for(int i = 1; i <= m; ++i) p[i].x = read(), p[i].y = read();
p[m + 1] = p[1];
for(int i = 1; i <= m; ++i) cut(p[i], p[i + 1]);
}
a[cnt + 1] = a[1];
db ans = 0;
for(int i = 1; i <= cnt; ++i) ans += a[i] * a[i + 1];
printf("%.3lf\n", ans / 2);
return 0;
}

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

  1. bzoj 2618: [Cqoi2006]凸多边形 [半平面交]

    2618: [Cqoi2006]凸多边形 半平面交 注意一开始多边形边界不要太大... #include <iostream> #include <cstdio> #inclu ...

  2. 洛谷 P4196 [CQOI2006]凸多边形 (半平面交)

    题目链接:P4196 [CQOI2006]凸多边形 题意 给定 \(n\) 个凸多边形,求它们相交的面积. 思路 半平面交 半平面交的模板题. 代码 #include <bits/stdc++. ...

  3. 【BZOJ 2618】 2618: [Cqoi2006]凸多边形 (半平面交)

    2618: [Cqoi2006]凸多边形 Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一 ...

  4. bzoj 2618 2618: [Cqoi2006]凸多边形(半平面交)

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 656  Solved: 340[Submit][Status] ...

  5. 2018.07.04 BZOJ 2618 Cqoi2006凸多边形(半平面交)

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MB Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n ...

  6. 【BZOJ2618】[CQOI2006]凸多边形(半平面交)

    [BZOJ2618][CQOI2006]凸多边形(半平面交) 题面 BZOJ 洛谷 题解 这个东西就是要求凸多边形的边所形成的半平面交. 那么就是一个半平面交模板题了. 这里写的是平方的做法. #in ...

  7. [CQOI2006]凸多边形(半平面交)

    很明显是一道半平面交的题. 先说一下半平面交的步骤: 1.用点向法(点+向量)表示直线 2.极角排序,若极角相同,按相对位置排序. 3.去重,极角相同的保留更优的 4.枚举边维护双端队列 5.求答案 ...

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

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

  9. bzoj2618: [Cqoi2006]凸多边形

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

随机推荐

  1. DWF Toolkit on Microsoft Windows

    If you are statically linking on Windows, you need these preprocessor defines: DWFTK_STATIC DWFTK_BU ...

  2. 信号量 P V测试详解

    信号量 当我们编写的程序使用了线程时,不管它是运行在多用户系统上,多进程系统上,还是运行在多用户多进程系统上,我们通常会发现,程序中存在着一部分临界代码,我们需要确保只有一个进程可以进入这个临界代码并 ...

  3. js只允许输入数字和两位小数

    一.js只允许输入数字和两位小数 //只允许输入数字和两位小数 function clearNoNum(obj) { obj.value = obj.value.replace(/[^\d.]/g, ...

  4. java EE 新手入门了解

    郑重申明:本文转载至https://blog.csdn.net/Neuf_Soleil/article/details/80962686,在此深表感谢! 为什么选择java? 想必有很多初学者会像我一 ...

  5. K:二叉查找树(BST)

    相关介绍:  二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tre ...

  6. 《JavaWeb从入门到改行》注册时向指定邮箱发送邮件激活

    javaMail API javaMail是SUN公司提供的针对邮件的API . 两个jar包  mail.jar 和 activation.jar java mail中主要类:javax.mail. ...

  7. 浅谈ul布局以及table布局

    我个人对于某些言论说要注重html语义化在布局中的应用,我反而不怎么感冒,试试兼容IE7&&项目期相对较赶的情况下,我还是推荐快速开发为主,兼容性强为主. 如果布局中需要用户边框,推荐 ...

  8. java 自定义 LRU(最近最少使用)策略 实现 缓存机制

    1. java提供了一个简单的方式实现LRU:  LinkedHashMap   2. 自定义实现 LRU至少需要两个主要操作: 添加(add)和搜索(search) public class LRU ...

  9. 01Jenkins环境准备

    01.硬件环境 Linux 64位(windows环境类似) 02.安装JDK a) 标题链接到Oracle官网下载jdk-8u144-linux-x64.rpm b) 将jdk拷贝到Linux的/t ...

  10. Web开发须知的浏览器内幕 缓存与存储篇(1)

    本文禁止转载,由UC浏览器内部出品. 0.前言 大纲 浏览器缓存和存储相关的功能分为四类: 加载流程 Memory Cache Application Cache(简称AppCache) HTTP C ...