Codeforces Round#123 D好奇怪- -|||

1 篇文章 0 订阅
1 篇文章 0 订阅

这么水的题,比赛时居然想错了。。。杯了个具的

然后,第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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值