凸包的边界无药可救,现在用的维护上凸壳下凸壳,叉积判断方向。
//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;
}