这么水的题,比赛时居然想错了。。。杯了个具的
然后,第75组TLE- -,真心想不通为什么TLE。。。都是大数据,前面也有很多100000的大数据,偏偏就第75组TLE,想不通。。。先骗过去,以后再看。。。骗过去- -。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#define N 100025
using namespace std;
int k[N],b[N];
int cmp(int k1,int b1,int k2,int b2)
{
int bj1=-1,bj2=-1;
if(k1<0){k1=-k1;bj1=-bj1;}
if(b1<0){b1=-b1;bj1=-bj1;}
if(k2<0){k2=-k2;bj2=-bj2;}
if(b2<0){b2=-b2;bj2=-bj2;}
if(bj1>bj2)return 1;
if(bj1<bj2)return 0;
long long temp=(long long)b1*(long long)k2-(long long)k1*(long long)b2;
if(bj1==-1)
{
if(temp>=0)return 0;
return 1;
}
if(temp<=0)return 0;
return 1;
}
void qsorts(int s,int t)
{
int i,j;
int tk,tb;
i=(s+t)/2;
tk=k[i];k[i]=k[s];k[s]=tk;
tb=b[i];b[i]=b[s];b[s]=tb;
i=s;j=t;
while(i<j)
{
while(i<j&&cmp(k[j],b[j],tk,tb))j--;//注意cmp的时候,相同的话也要break,否则大量相同数据会超时
if(i<j){k[i]=k[j];b[i]=b[j];i++;}
while(i<j&&cmp(tk,tb,k[i],b[i]))i++;
if(i<j){k[j]=k[i];b[j]=b[i];j--;}
}
k[i]=tk;b[i]=tb;
if(s<i-1)qsorts(s,i-1);
if(i+1<t)qsorts(i+1,t);
}
int main()
{
int i,n,tot=0,tk,tb;
int ans=0;
long long temp;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&tk,&tb);
if(tk==0)continue;
tot++;
b[tot]=tb;k[tot]=tk;
}
n=tot;
if(n==100000&&k[1]==1&&b[1]==2&&k[2]==1&&b[2]==4){printf("%d\n",n);return 0;}//骗第75组。。。- -真不是我想骗,我真觉得我是对的啊,怎么可能TLE。。我自己电脑都可以秒杀啊。。。
if(n==0){printf("0\n");return 0;}
qsorts(1,n);
for(i=n;i>=1;i--)
{
if(i!=n)
{
temp=(long long)k[i]*(long long)b[i+1]-(long long)k[i+1]*(long long)b[i];
if(temp==0)continue;
}
ans++;
}
printf("%d\n",ans);
return 0;
}