用对称的思想,每次极角排序前,把黑点按原点对称,就可以转换成为白点进行统计了
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define N 200005 #define db double const db eps=1e-6; const db pi=acos(-1); int sign(db k){if (k>eps) return 1; else if (k<-eps) return -1; return 0;} int cmp(db k1,db k2){return sign(k1-k2);} struct point{ db x,y;int c; point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};} point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};} point operator * (db k1) const{return (point){x*k1,y*k1};} point operator / (db k1) const{return (point){x/k1,y/k1};} int getP() const{return sign(y)==1||(sign(y)==0&&sign(x)>=0);} }; db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;} db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;} bool operator<(const point k1,const point k2){ if(k1.getP()==k2.getP())return sign(cross(k1,k2))>0; return k1.getP()<k2.getP(); } point p[N],pp[N]; int n,tot,ans; void solve(int id){ tot=0; for(int i=1;i<=n;i++)if(i!=id){ pp[++tot]=p[i]-p[id]; pp[tot].c=p[i].c; if(pp[tot].c==1){ pp[tot].x*=-1; pp[tot].y*=-1; } } sort(pp+1,pp+1+tot); for(int i=1;i<=tot;i++)pp[tot+i]=pp[i]; int num=1,pos=1; for(int i=1;i<=tot;i++){ while(pos+1<i+tot && sign(cross(pp[i],pp[pos+1]))>=0) pos++,num++; ans=max(ans,num); num--; } } int main(){ while(cin>>n && n){ ans=0; for(int i=1;i<=n;i++) scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].c); for(int i=1;i<=n;i++) solve(i); cout<<ans+1<<' '; } }