zz題,隨便搞搞就行了
然而代碼寫得又醜又慢,有時間再改改吧
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef long long LL;
inline int read()
{
int x=0;bool f=0;char c=getchar();
for (;c<'0'||c>'9';c=getchar()) f=c=='-'?1:0;
for (;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
return f?-x:x;
}
#define R register
const int N=100005;
int n,m,m2,p0,p1,x1,y1,cnt0=0,ans1,ans2;
struct na {int x,y;}e[N],num[N];
inline bool cmp (const na &a,const na &b){
if (a.x==b.x&&a.y==b.y) return 0;
if (!a.x&&!b.x) return 0;
if (!a.x) return 1;
if (!b.x) return 0;
if ((a.x>0)^(b.x>0)) return a.y*b.x>a.x*b.y;
return a.y*b.x<a.x*b.y;
}
inline bool eql(const na &a,const na &b){
return (!a.x&&!b.x)||(a.x*b.y==a.y*b.x);
}
struct bitt{
int ss[N];
inline void add(R int x,R int a){
for (;x;x-=x&-x) ss[x]+=a;
}
inline int cal(R int x){
int rec=0;
for (;x<=p0;x+=x&-x) rec+=ss[x];
return rec;
}
}s1,s2;
int main()
{
n=read()-1;
x1=read(),y1=read();
for (int i=1;i<=n;i++)
{
e[i].x=read()-x1,e[i].y=read()-y1;
if (!e[i].x&&!e[i].y) n--,i--,cnt0++;
else num[++m]=e[i];
}
num[++m]=(na){0,1};
num[++m]=(na){1,0};//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
sort(num+1,num+m+1,cmp);m2=1;
for (int i=2;i<=m;i++)
if (m2&&!eql(num[m2],num[i]))
num[++m2]=num[i];
m=m2;
// m=unique(num+1,num+m+1,cmp)-num-1;
p0=lower_bound(num+1,num+m+1,(na){1,0},cmp)-num;
p1=lower_bound(num+1,num+m+1,(na){0,1},cmp)-num;
for (int i=1;i<=n;i++){
int x=e[i].x,y=e[i].y,k=lower_bound(num+1,num+m+1,e[i],cmp)-num;
if (!y)
{
if (x>0)
{
s1.add(p0-1,1);
s2.add(p0,1);
}
else
{
s2.add(p0,1);
s2.add(p0-1,-1);
}
}
else if (!x)
{
if (y>0)
{
s1.add(p0,1);
s1.add(1,-1);
//!!!!!!!!!!!!!!!!!!!!!!!1
s2.add(p0,1);
}
else
{
s2.add(1,1);
}
}
else if (x>0&&y>0)
{
s1.add(p0,1);
s2.add(p0,1);
}
else if (x>0&&y<0)
{
s1.add(k-1,1);
s2.add(k,1);
}
else if (x<0&&y>0)
{
s1.add(p0,1);
s1.add(k,-1);
s2.add(p0,1);
s2.add(k-1,-1);
}
}
ans1=1e9;ans2=0;
for (int i=1;i<=p0;i++)
{
ans1=min(ans1,s1.cal(i));
ans2=max(ans2,s2.cal(i));
}
ans1++;
ans2=ans2+1+cnt0;
printf("%d %d\n",ans1,ans2);
return 0;
}