目錄計算幾何拖了這麼久,終於拖到省選前了。
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...