Test instructions: give you n a tower (dot) to form a clockwise convex hull, the enemy can destroy any tower, destroy the remaining tower and then make a convex bag
Select a point in the beginning of the main tower, to ensure that the enemy destroyed as many towers as possible when the main tower is still in the current convex hull, to find the most destroyed tower
Problem: The key is to choose the main tower in different places, the enemy will destroy different towers to let your main tower exposed
So think about it, find out all the different bumps that the enemy has formed after destroying the different towers, and finding out all the bumps.
Specifically, first enumerate the number of destroyed tower K, and then destroy any K tower formed by all the different convex hull for a turn, if the empty represents the destruction of K tower must be able to ensure that no matter where the main tower can be exposed (critical)
The intersection of all convex hull can be converted to find the straight line on all convex hull for half-plane intersection, followed by the attention of the enemy to destroy the continuous K-tower must be optimal, so the half-plane intersection of the line as long as N (understand)
Finally, we can find that the answer satisfies the monotony and can be answered by two points.
And then there's a little trick that is to find a straight line when you need to counter-clockwise (because half-plane intersection is counter-clockwise to ask)
#include <Set>#include<map>#include<queue>#include<stack>#include<cmath>#include<vector>#include<string>#include<cstdio>#include<cstring>#include<iomanip>#include<stdlib.h>#include<iostream>#include<algorithm>using namespacestd;#defineEPS 1E-8/*Note that there may be output -0.000*/#defineSGN (x) (X<-eps -1:x<eps? 0:1)//X is a comparison of two floating-point numbers, note the return integer#defineCVS (x) (x > 0.0 x+eps:x-eps)//floating point Conversion#defineZero (x) (((x) >0? ( x):-(x)) <eps)//determine if it equals 0#defineMul (A, B) (a<<b)#defineDir (A, B) (a>>b)typedefLong Longll;typedef unsignedLong Longull;Const intinf=1<< -;Constll inf=1ll<< -;Const DoublePi=acos (-1.0);Const intmod=1e9+7;Const intmax=50010;structpoint{Doublex, y; Point (Doublex=0,Doubley=0): X (x), Y (y) {}; intRead () {scanf ("%LF%LF",&x,&y); } Inline Pointoperator+(Constpoint& a)Const { returnPoint (x+a.x,y+a.y); } Inline Pointoperator*(DoubleAConst { returnPoint (x*a,y*a); } Inline Pointoperator-(Constpoint& a)Const { returnPoint (x-a.x,y-a.y); } InlineBOOL operator< (Constpoint& a)Const { returnSGN (x-a.x) <0|| Zero (x-a.x) &&SGN (Y-A.Y) <0; } InlineBOOL operator!=(Constpoint& a)Const { return! (zero (x-a.x) &&zero (ya.y)); }};typedef point Vector;structline{point P; Vector v; DoubleAng//Polar AngleLine () {}; Line (Point P,vector v):p (P), V (v) {ang=atan2 (v.y,v.x); } InlineBOOL operator< (Constline& L)Const { returnang<L.ang; }};DoubleDis (Point a,point B) {returnsqrt ((a.x-b.x) * (a.x-b.x) + (A.Y-B.Y) * (a.y-b.y));}DoubleCross (Vector a,vector B) {returna.x*b.y-a.y*b.x;}BOOLonleft (line L,point p) {returnCross (L.V,P-L.P) >0;} Point Getintersection (line A,line b) {Vector u=a.p-B.P; DoubleT=cross (b.v,u)/Cross (A.V,B.V); returna.p+a.v*t;}intHarfplaneintersection (Line *l,intN) {Sort (l,l+n);//for (int i=0; i<n; ++i)// {//printf ("%lf%lf%lf%lf\n", l[i].p.x,l[i].p.y,l[i].v.x,l[i].v.y);// } intFirst,last; Point*p=NewPoint[n]; Line*q=NewLine[n]; Q[first=last=0]=l[0]; for(intI=0; i<n; ++i) { while(First<last &&!) Onleft (l[i],p[last-1])) last--; while(First<last &&!) Onleft (L[i],p[first]) first++; q[++last]=L[i]; if(Zero (Cross (q[last].v,q[last-1].v )) {Last--; if(Onleft (Q[LAST],L[I].P)) Q[last]=L[i]; } if(first<Last ) P[last-1]=getintersection (q[last-1],q[last]); } while(first<last&&! Onleft (q[first],p[last-1] ) Last--;//printf ("%d\n", last-first-1); returnMax (last-first-1,0);} Point Tow[max]; Line Convex[max];intSolve (intMidintN) { if(n-mid<=2)//the remaining points return 0; for(intI=0; i<n; ++i) {//Note that the semi-flat is counterclockwiseConvex[i]=line (tow[i],tow[(i-mid-1+n)%n]-tow[i]);//key, the half-plane after the mid point is removed } returnharfplaneintersection (convex,n);}intDichotomy (intLefintRigintN//two points{ while(lef<rig) { intMid= (lef+rig>>1);//The number of points deleted by the representative if(Solve (Mid,n))//non-empty is the need to delete more points{lef=mid+1; } Else{Rig=mid; } } returnlef;}intMain () {intN; while(~SCANF ("%d",&N)) { for(intI=0; i<n; ++i) {tow[i].read (); } printf ("%d\n", Dichotomy (1, N,n)); } return 0;}
Uvalive 4992 Jungle Outpost (semi-flat cross)