沒人做計算幾何了,怎麼會事呢...
這幾把軍訓...laji時間找點laji題來做
一. 板子
1.basic
2.凸包
3.半平面交
二.板題
三.題目
P3194
給出\(N<50000\)條直線,找出從y正無窮大可見直線
手玩發現所有可見線段構成一個下凸殼。將所有直線按照斜率遞增排序,用單調棧維護。棧頂為AB,插入C時,若AC交點在AB交點左側或重合,則B無貢獻。注意每種斜率的直線保留最上面的
for(int i=1;i<=n;++i) {
if(l[i].k==l[i-1].k) continue;
while(cnt>=2) {
point A1=point(1,f(l[stk[cnt]],1)),A2=point(2,f(l[stk[cnt]],2));
point B1=point(1,f(l[stk[cnt-1]],1)),B2=point(2,f(l[stk[cnt-1]],2));
point C1=point(1,f(l[i],1)),C2=point(2,f(l[i],2));
if(dcmp(LL(A1,A2,B1,B2).x-LL(C1,C2,A1,A2).x)>=0) {
cnt--;
} else break;
}
stk[++cnt]=i;
}
P2924
給出\(N<=250\)個點,保證不存在三點共線,求可以由這些點圍成的凸包中,最多的點數
dp。注意到轉移的斜率是單調的,把n方條邊全部連上並按斜率排序作為轉移。以每個點為起點dp一次,一定有一個點是轉移首尾相連的位置。從起點擴張的正向邊與回到起點的反向邊的列舉順序是相反的,不會造成影響
for(int i=1;i<=n;++i) {
memset(f,-0x3f,sizeof(f));
f[i]=0;
for(int j=1;j<=cnt;++j) {
f[e[j].r]=max(f[e[j].r],f[e[j].l]+1);
}
ans=max(ans,f[i]);
}