計算幾何基礎 模板

2022-04-02 14:22:50 字數 3576 閱讀 9959

目錄計算幾何拖了這麼久,終於拖到省選前了。

emm不求能a題,只求寫暴力。

參考:

ps: 剛開始寫的**,讀入用的p[i]=(point),因為初始化了建構函式所以這麼讀進去橫縱座標可能是反的。。

有些題並沒有影響所以以前的就不改了。

#include #include #include #include #include #include #define gc() getchar()

typedef long long ll;

const int n=1e5+5;

const double eps=1e-10;

inline int dcmp(double x)

return cnt&1;

} double area()//多邊形有向面積(逆時針為正,順時針為負)

int k=top;

for(int i=n-2; ~i; --i)

return top;

}};int main()

洛谷.2742.[模板]二維凸包。

\(granham's\ scan\):

選出所有點中橫座標最小(如果相同取縱座標最小的)的點\(x\),將所有點按與\(x\)的極角序排序。

將\(x\)放到棧裡,跑一遍單調棧求凸包。

這個做法似乎精度不太好。

另一種做法是:

將所有點按橫座標為第一關鍵字,縱座標為第二關鍵字排序。

將\(1\)號點放到棧裡,單調棧求一遍下凸殼。

保留原先棧中的元素,單調棧求一遍上凸殼。

複雜度都是\(o(n\log n)\)。

#include #include #include #include //#define gc() getchar()

#define maxin 500000

#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)

typedef long long ll;

const int n=1e4+6;

int sk[n];

char in[maxin],*ss=in,*tt=in;

struct vec

vec operator +(const vec &a)const

vec operator -(const vec &a)const

vec operator *(const double a)const

bool operator <(const vec &a)const

int m=top;

for(int i=n-1; i; --i)

double ans=0;

for(int i=1; i一道例題。

bzoj.1069.[scoi2007]最大土地面積

求四邊形最大面積,列舉一條對角線,求對角線兩邊最大三角形面積即可。

暴力是\(n^3\)的,容易發現固定對角線乙個端點,另乙個端點移動時兩邊最遠點的移動也是單調的。所以用旋轉卡殼優化一下就是\(o(n^2)\)啦。

旋轉卡殼還有很多用途,見最上面的鏈結。

經常要找和當前直線平行的直線切在**,注意用底相同,平行線之間高也相同,以及叉積有正負的性質,求叉積。

求凸多邊形最小面積外接矩形,找三個邊界點時(列舉下邊界點\(d\)),上邊界點\(u\)可以如上所說用叉積判(判斷\((p_u-p_d)*(p_-p_d)\)與\((p_-p_d)*(p_-p_d)\)的大小關係,比它小則\(u+1\))。

點積可以求向量在另乙個向量上的對映長度,所以右邊界點\(r\)可以用點積求(在\(p_-p_d\)上對映長度最長的)。

同理,左邊界點\(l\)也用點積求,不過注意剛開始要將\(l\)賦值為\(r\)。

[bzoj1069]的**:

//884kb 120ms

#include #include typedef long long ll;

const int n=2005;

struct vec

vec operator +(const vec &a)const

vec operator -(const vec &a)const

double operator *(const vec &a)const

bool operator <(const vec &a)const

int k=top;

for(int i=n-1; i>1; --i)

double ans=0; sk[top+1]=sk[1];

#define inc(x) (x+1>top?1:x+1)

for(int i=1; i+2<=top; ++i) }

printf("%.3f\n",ans*0.5);

return 0;

}

咕咕了。

具體見這裡。

#include #include #include #include #define gc() getchar()

#define maxin 500000

//#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)

typedef long long ll;

const int n=1e6+5;

char in[maxin],*ss=in,*tt=in;

struct vec

vec operator +(const vec &a)const

vec operator -(const vec &a)const

vec operator *(const double a)const

double operator *(const vec &a)const

vec rotate_90()const

double len()const

double len2()const

}p[n];

typedef vec point;

struct line

line perpendicularbisector()const//垂直平分線=-=

point intersection(const line &l)const };

inline double read()

point calccircle(const point &a,const point &b,const point &c)

void solve(const int n)

} printf("%.2f %.2f %.2f\n",o.x,o.y,sqrt(r));

}int main()

;//宣告建構函式之後再這麼用,貌似。。= = 不同編譯器結果不同。。

solve(n);

return 0;

}

計算幾何基礎詳解與模板

不知道為啥,還是比較喜歡手寫公式,大概是因為比較方便吧 判等 const double eps 1e 9 int dcmp double x,double y return 1 標頭檔案 include include 常用常數 const double pi acos 1.0 const doub...

計算幾何模板

sgn返回x經過eps處理的符號,負數返回 1,正數返回1,x的絕對值如果足夠小,就返回0。const double eps 1e 8 int sgn double x double mysqrt double x pt是point的縮寫 int版 struct pt pt int x,int y ...

計算幾何模板

include define vct point using namespace std const double pi atan2 0,1 const double eps 1e 8 int sgn double d struct point bool operator point b const...