演算法複習 半平面交(bzoj2618凸多邊形)

2022-05-23 15:00:10 字數 2033 閱讀 4159

這裡套用wuvin

逆時針給出n個凸多邊形的頂點座標,求它們交的面積。例如n=2時,兩個凸多邊形如下圖:

則相交部分的面積為5.233。

第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi

,表示多邊形的邊數,以下mi

行每行兩個整數,逆時針給出各個頂點的座標。

輸出檔案僅包含乙個實數,表示相交部分的面積,保留三位小數。26

-2 0

-1 -2

1 -2

2 01 2

-1 2

40 -3

1 -1

2 2-1 0

5.233

100%的資料滿足:2<=n

<=10,3<=mi

<=50,每維座標為[-1000,1000]內的整數

半平面交裸題

主要是**很煩吧···一定要理清點與點之間的關係,多畫圖幫助理解;

#include#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=250005

;struct

point

p[n],a[n];

struct

line

l[n],q[n];

inline

double

operator *(point a,point b)

inline point

operator -(point a,point b)

inline point inter(line a,line b)

bool

jud(line a,line b,line c)

intn,k,cnt,tot;

double

ans;

bool

comp(line a,line b)

void

build()

int left=1,right=0

; q[++right]=l[1

]; q[++right]=l[2

]; cnt=tot,tot=0;

for(int i=3;i<=cnt;i++)

while(left1],q[right],q[left])) right--;

while(left1],q[left],q[right])) left++;

q[right+1]=q[left];

for(int i=left;i<=right;i++)

a[++tot]=inter(q[i],q[i+1

]);

}void

getans()

intmain()

} /*for(int i=1;i<=cnt;i++)

cout

for(int i=1;i<=cnt;i++)

l[i].slope=atan2(l[i].b.y-l[i].a.y,l[i].b.x-l[i].a.x);

build();

getans();

printf(

"%.3lf\n

",ans);

return0;

}

BZOJ2618 半平面交)

逆時針給出n個凸多邊形的頂點座標,求它們交的面積。給你n個凸多邊形,求多邊形的交的面積 給你一堆邊,讓你求半平面交的面積 半平面交模板 定義點 struct tpoint 定義線 一點 一方向 struct tline 1.定義半平面為向量的左側 逆時針給出,只需要後乙個減前乙個是方向 2.將所有向...

BZOJ 2732 射箭(半平面交)

題意 給出n條第一象限內的豎直線段。求乙個最大的k,使得某條經過原點的拋物線穿過前k條線段。思路 設線段為 x,y1,y2 設拋物線為y ax 2 b x,那麼有 y1 ax 2 bx y2。據此可得到穿過該線段的拋物線引數a和b的兩個方程,這兩個方程是線性的。因此,可以半平面交,直到半平面內的點構...

bzoj 3190 賽車 半平面交

直接寫的裸的半平面交,已經有點背不過模板了。這題卡精度,要用long double esp設1e 20。include include include include include include include define n 20005 define double long double d...