急!!!凸包的边界处理!
查看原帖
急!!!凸包的边界处理!
142549
hbhz_zcy楼主2022/7/21 22:05

凸包的边界无药可救,现在用的维护上凸壳下凸壳,叉积判断方向。

//g++ d.cpp -g -o d -Wall -std=c++14 -O0
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=1e5+10;
const double eps=1e-6;
int M;
struct node{int x,y;};
bool operator <(const node &x,const node &y){return x.x==y.x?x.y<y.y:x.x<y.x;}
bool operator ==(const node &x,const node &y){return x.x==y.x&&x.y==y.y;}
vector<node>q1,q2;
vector<node>::iterator it;
int qd(){
	int rt=0;char c=getchar();
	while(c<'0'||c>'9')  c=getchar();
	while('0'<=c&&c<='9')  rt=(rt<<3)+(rt<<1)+c-48,c=getchar();
	return rt;
}
#define bn1 q1.begin()
#define en1 (q1.end()-1)
#define bn2 q2.begin()
#define en2 (q2.end()-1)
#define calc(x1,y1,x2,y2,x3,y3) (((1LL*(x2)-(x1))*(y3)-(y1))-(1LL*(x3)-(x1))*((y2)-(y1)))
#define _calc(t1,t2,t3) calc(t1.x,t1.y,t2.x,t2.y,t3.x,t3.y)
void ins(int x,int y){
	node t=(node){x,y};
//	printf("ins %d,%d\n",x,y);
//	if(!q1.empty())  printf("%d,%d %s %d,%d\n",en1->x,en1->y,*en1<t?"<":">=",x,y);
	if(q1.size()<=1){q1.push_back(t),q2.push_back(t);return;}
	int p=lower_bound(bn1,en1+1,t)-bn1,l=p-1,r=p;
	if(p==q1.size())  l--,r--;
	for(;l>=0;l--)  if(_calc(q1[l-1],q1[l],t)>0)  break;
	for(;r<q1.size();r++)  if(_calc(q1[r-1],q1[r],t)>0)  break;
	l++,r--;
	if(l+1<=r)  q1.erase(bn1+l+1,bn1+r);
	q1.insert(bn1+l+1,t);
	
	p=lower_bound(bn2,en2,t)-bn2,l=p-1,r=p;
	if(p==q2.size())  l--,r--;
	for(;l>=0;l--)  if(_calc(q2[l-1],q2[l],t)<0)  break;
	for(;r<q1.size();r++)  if(_calc(q2[r-1],q2[r],t)<0)  break;
	l++,r--;
	if(l+1<=r)  q2.erase(bn2+l+1,bn2+r);
	q2.insert(bn2+l+1,t);
}
int judge(int x,int y){
	node t=(node){x,y};
	if(q1.size()<=1)  return 0;
	if(t==*bn1||t==*en1)  return 1;
//	printf("judge %d %d\n",x,y);
//	printf("%d %s %d\n",x,x<bn1->x?"<":">=",bn1->x);
//	printf("%d %s %d\n",x,x>en1->x?">":"<=",en1->x);
	if(x<bn1->x||x>en1->x)  return -1;
	int p=lower_bound(bn1,en1+1,t)-bn1;
	if(!p||p==q1.size())  return -1;
//	printf("?> <%d,%d,%d,%d>=%lf <%d,%d,%d,%d>=%lf\n",ix,iy,x,y,_dy_x(ix,iy,x,y),ix,iy,jx,jy,_dy_x(ix,iy,jx,jy));
	if(_calc(q1[p-1],q1[p],t)>0)  return -3;
	
	p=lower_bound(bn2,en2+1,t)-bn2;
	if(_calc(q2[p-1],q2[p],t)<0)  return -5;
	return 1;
}
int main(){
	freopen("in.txt","r",stdin);
	M=qd();
	while(M--){
		int t=qd(),x=qd(),y=qd();
		printf("judge = %d\n",judge(x,y));
		if(t==1&&judge(x,y)<=0)  ins(x,y);
		else printf("%s\n",judge(x,y)>0?"YES":"NO");
	}
	return 0;
}
2022/7/21 22:05
加载中...