Gym 100520K 半平面交

2021-09-01 00:21:51 字數 1338 閱讀 8493

解題思路:

二分圓的半徑,然後用半平面交解得是否有解,最後在有解的多邊形中取最遠的兩個點看他們的距離是否超過直接,如果超過,那麼以這兩個點為圓心的兩個圓就不會相交了。最遠的點也就是列舉頂點兩兩的距離。

#include using namespace std;

typedef long long ll;

const int mx = 2e2 + 10;

int n;

struct point; }

double operator * (point a)const

point operator + (point a)const

; }point operator * (double d)const

; }}s[mx],tmp[2],pue[mx],ans[2];

typedef point vec;

struct line

}l[mx],lue[mx];

point getp(point p,double angle,double r);}

point intersection(line a,line b)

;*/ vec u = a.p1 - b.p1;

double t = (b.v*u) / (a.v*b.v);

return a.p1 + a.v*t;

}double dist(point a,point b)

bool judge(int l,int r,double m)

bool onright(line a,point b)

; return d <= 0;

}bool check(double m)

sort(l,l+n);

int tail = 0,head = 0;

lue[0] = l[0];

for(int i=1;iwhile(headpue[tail] = intersection(lue[tail],lue[head]);

return judge(head,tail,m);

}int main()

double l = 0,r = 1e5;

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

printf("%.8lf\n",l);

printf("%.8lf %.8lf\n",ans[0].x,ans[0].y);

printf("%.8lf %.8lf\n",ans[1].x,ans[1].y);

} return 0;}/*

50 0

3 44 6

6 10

10 18

*/

半平面交模板

妹的,一直沒有想清楚無解的情況到底是如何判斷的。偷來乙個模板。半平面交的結果 1.凸多邊形 後面會講解到 2.無界,因為有可能若干半平面沒有形成封閉3.直線,線段,點,空 屬於特殊情況吧 演算法 1 根據上圖可以知道,運用給出的多邊形每相鄰兩點形成一條直線來切割原有多邊形,如果多邊形上的點i在有向直...

模板 半平面交

考慮用射線 乙個點和乙個向量 表示它左側的半平面 那麼我們可以先按與x軸正半軸夾角 可用atan2 y,x 實現 排序,然後再用雙端佇列維護當前在交中的射線即可 之所以要用雙端佇列,是因為新插入乙個半平面時隊首和隊尾都有可能被彈出,而且要注意的是,要先彈隊尾再彈隊首 在最後,還要再用隊首的彈一些隊尾...

半平面交 板子

poj 2451 敲了個板子,比帶花樹稍微好一些,但是還是很麻煩.寫了點注釋 include include include define point vector const int n 2e4 10 struct vector vector double x,double y double an...