BNU校賽總決賽J 小白兔小灰兔 相交計算幾何模板

2022-06-02 07:06:08 字數 3283 閱讀 5074

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

special judge, 64bit io format: %lld

老山羊伯伯在地里收白菜,小白兔和小灰兔看見了就一起來幫忙。

他們幹了半天,終於幹完了。

羊伯伯:小灰兔,這車白菜送給你!

小灰兔:謝謝羊伯伯!

羊伯伯:小白兔,我也送你一車白菜!

小白兔:我不要白菜!給我一包白菜種子吧!

羊伯伯:好!給你~

小白兔:謝謝羊伯伯~

小灰兔把白菜拉到家裡之後,就跟大家夢想中的生活一樣,躺著啥都不幹,吃吃吃,吃了玩~(好想一輩子都這樣啊~小灰兔心想。)

小白兔把種子拿回去,打算開始勤勞地種白菜。然而他發現不是所有土地都能用來種白菜,只有被陽光照到的地方可以種白菜。

小白兔生活的星球可以看作二維平面中的乙個簡單多邊形,太陽可以看作乙個點。小白兔想知道,這個星球上一共有長度多少的土地可以用來種白菜。

第一行是乙個正整數t(≤ 20),表示測試資料組數,

對於每組測試資料,

第一行是乙個整數n(3≤ n≤ 10),表示簡單多邊形的頂點數,

接下來n行,每行是兩個整數xi,yi(-10≤ xi,yi≤10),按照逆時針繞向給出簡單多邊形的n個頂點的座標,

最後一行是兩個整數x,y(-10≤ x,y≤10),表示太陽的座標,保證太陽在多邊形外且不在多邊形任意一條邊所在直線上。

對於每組測試資料,輸出一行,包含乙個實數,表示可以用來種白菜的土地的總長度,要求相對誤差不超過

,也就是說,令輸出結果為a,標準答案為b,若滿足

,則輸出結果會被認為是正確答案。

示例1

2

40 0

2 02 2

0 24 1

40 0

2 02 2

0 24 4

2.000000000000

4.000000000000

1 #include2

#define clr(x) memset(x,0,sizeof(x))

3#define clr_1(x) memset(x,-1,sizeof(x))

4#define mod 1000000007

5#define inf 0x3f3f3f3f

6#define ll long long

7#define pb push_back

8#define pbk pop_back

9#define ls(i) (i<<1)

10#define rs(i) (i<<1|1)

11#define mp make_pair

12using

namespace

std;

13 typedef double

db;14

const

int n=5e5+10;15

const db eps=1e-9;16

int equzero(db t)//

帶精度大小判斷

1722

struct

point

2326

point(db _x,db _y):x(_x),y(_y) {}

27 point operator +(const point &b) const//+

2831 point operator -(const point &b) const//-

3235 point operator *(const db &b) const

//放大

3639 point operator /(const db &b) const

//縮小

4043 db dot(const point &b) const

//點積

4447 db det(const point &b) const

//叉積

4851

bool

operator ==(const point &b) const

5255

bool

operator !=(const point &b) const

5659 db mo() //模60

63}pt[n],u,v,mid;

64struct

line

6568

line (point _a,point _b):a(_a),b(_b) {};

69bool quickrej(const line &t) const

//快速排斥判斷

7073 db len() const

7477

bool stra(const line &t) const

//跨立判斷

7881

bool gfxj(const line &t) const

//規範相交

8285

bool on(const point &t) const

//86

97bool kddxj(const line &t) const

//可多點相交

98101

bool para(const line &t) const

//平行或在一條直線上

102105 db operator & (const line &t) const

//返回切點佔直線比例,距a比例

106111

}le[n],lu,lv;

112int

n,m,t;

113 vectorcp;

114db ans,ins,rate;

115bool

flag;

116int

main()

117135

sort(cp.begin(),cp.end());

136 rate=0

;137

for(int j=0;j1;j++)

138148

}149

if(!flag)

150153

}154 ans+=rate*le[i].len();

155}

156 printf("

%.12f\n

",ans);

157}

158return0;

159 }

view code

新生周賽總決賽題解

a cxk的籃球 加強版 include using namespace std const int size 1e6 int a size c size 10 long long ans 0,ask,n,m,x,y,w int main cin ask 輸入查詢下標 for long long i...

BNU校賽B題 多重求和

題意就不再複述了,比較容易理解 這道題我推了半天公式沒推出來 賽後發現是因為當時有乙個沒有約分導致之後的猜想錯誤 這道題在這場比賽中是由我們學校的大二的張航學長一血的 十分佩服 其實公式也不是特別難推 找規律應該能找到 其實我都找了一半了 最後因為沒有約分進入了錯誤的猜想 其實找到通項公式之後就是一...

GDUT 2016校賽決賽

用max1 money 來表示花費money在頭盔和首飾上能得到的最優值,故列舉a,列舉b,列舉a i b j 的a b種情況。因為b和a可能有依賴關係 用max2 money 來表示花費money在單手和雙手上能得到的最優值,故列舉c兩兩相加的c c 1 種情況,再列舉d即可 max1,max2都...