Something about 計算幾何

Kur0n1ko發表於2024-07-08

沒人做計算幾何了,怎麼會事呢...

這幾把軍訓...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]);
}

四.亂七八糟

相關文章