题目
y<x^2+bx+c
y-x^2<bx+c
转化为求上凸包
#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int maxp=2e5+7;
const double inf=1e100;
const double eps=1e-8;
const double pi =acos(-1.0);
struct Point{
ll x,y;
Point(ll x=0,ll y=0):x(x),y(y){}
bool operator ==(const Point& b){return !(x-b.x)&&!(y-b.y);}
bool operator <(const Point& b)const{return (x==b.x)?y>b.y:x<b.x;}
ll operator^(const Point& b){return x*b.y-y*b.x;}//叉积
ll operator*(const Point& b){return x*b.x+y*b.y;}//点积
Point operator +(const Point &b){return Point(x+b.x,y+b.y);}
Point operator -(const Point& b){return Point(x-b.x,y-b.y);}
ll len2(){return x*x+y*y;}
void input(){scanf("%lld%lld",&x,&y);}
void show(){printf("%lld %lld\n",x,y);}
};
struct polygon{
int n;
Point *p;
void input(int _n){n=_n;for(int i=0;i<n;++i)p[i].input();}
void upconvex(polygon &convex){
sort(p,p+n);
int top=0;
convex.p[top++]=p[0];
for(int i=1;i<n;++i)if(p[i].x!=p[i-1].x){
while(top>1&&((convex.p[top-1]-convex.p[top-2])^(p[i]-convex.p[top-2]))>=0)--top;
convex.p[top++]=p[i];
}
convex.n=top;
}
};
Point ap[maxp],bp[maxp];
polygon a,b;
int main(){
a.p=ap,b.p=bp;
int n;
scanf("%d",&n);
a.input(n);
for(int i=0;i<a.n;++i)a.p[i].y-=a.p[i].x*a.p[i].x;
a.upconvex(b);
printf("%d\n",b.n-1);
return 0;
}