清北学堂-D1-T2-polyline

来源:互联网 发布:网络小贷 编辑:程序博客网 时间:2024/05/16 07:43

这里写图片描述
题目给定了若干条直线,并将它们的小于0的部分强制改为0,然后定义了一个累加函数,将所有函数加到一起,然后求拐点个数。
题解:可以看出,所有函数单独拿出来斜率单增,所以加到一起斜率也是单增的,然后问题就变成了求不同的零点个数,然后有两个办法,一个卡精度,另一个就是改一下比较函数,不要算零点(那个比较的函数可以去掉除号,可以互相乘过去),然后就判断就好了。
代码:(卡精度)

#include<cstdio>#include<cstdlib>#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#define ll long longusing namespace std;inline int read(){    int x=0,f=1;char ch=' ';    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();    if(ch=='-')f=-1,ch=getchar();    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();    return x*f;}int n,nn;int k[100001],b[100001];long double c[100001];int main(){    freopen("polyline.in","r",stdin);    freopen("polyline.out","w",stdout);    n=read();nn=1;    for(int i=1;i<=n;i++){        k[nn]=read();b[nn]=read();        if(k[nn])        c[nn]=-(long double)b[nn]/(long double)k[nn++];    }    nn--;    sort(c+1,c+nn+1);    int ans=nn;    if(nn==0){        printf("0");return 0;    }    for(int i=2;i<=nn;i++){        if(fabs(c[i]-c[i-1])<1e-18){            ans--;        }    }    printf("%d",ans);    return 0;}

代码2:(乘法/std)

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int N = 201000;long long a[N], b[N];int q[N];int gcd(int x, int y){    int t = x % y;    while (t != 0)    {        x = y;        y = t;        t = x % y;    }    return y;}bool cmp(int i, int j){    if (a[i] * b[j] < a[j] * b[i]) return 1;    return 0;}int main(){    freopen("polyline.in","r",stdin);    freopen("polyline.out","w",stdout);    int m, n = 0;    scanf("%d", &m);    for (int i = 1; i <= m; ++i)    {        int x, y;        scanf("%d%d", &x, &y);        if (x == 0) continue;        ++n;        q[n] = n;        a[n] = -y;        b[n] = x;        if (b[n] < 0)        {            a[n] *= -1;            b[n] *= -1;        }        if (y == 0)         {            b[i] = 1;            continue;        }        int d = gcd(abs(a[n]), abs(b[n]));        a[n] /= d;        b[n] /= d;    }    sort(q + 1, q + n + 1, cmp);    int ans = n;    for (int i = 1; i < n; ++i)    {        int k = q[i];        int kk = q[i + 1];        if (a[k] == a[kk] && b[k] == b[kk])            --ans;    }    printf("%d\n", ans);    return 0;}
原创粉丝点击