小朋友排队

来源:互联网 发布:dream it possible 编辑:程序博客网 时间:2024/04/28 09:53

这题是一个简单的分治合并。
我最想说的是本来我半年前就做出来这题的,可是找了很久的bug都一直找不到。坑

今天我终于找到了,原来是两个int相乘溢出了,无语+开心。
temp=(a[i].count+1)*a[i].count; //错误点

举个例子吧

#include<cstdio>int n=2147483647;//int的上限int main(){    printf("%d\n",n);    long long p;    p=2147483647*10;//int溢出    p=n+n; //int溢出,只有把n改为long long才能得到正确结果    printf("%lld\n",p);    return 0;}

贴个AC代码

#include<cstdio>#include<cstdlib>#include<ctime>struct children{    int height;     long long count;   }a[100010]; struct children b[100010];void merge(int start,int middle,int end){    int i=start,j=middle+1,k=start;    while(i<=middle&&j<=end)    {        if(a[i].height>a[j].height)        {            a[j].count+=middle-i+1;            b[k++]=a[j++];        }        else         {            a[i].count+=j-middle-1;            b[k++]=a[i++];        }    }    while(i<=middle)    {        a[i].count+=end-middle;        b[k++]=a[i++];    }    while(j<=end)    {        b[k++]=a[j++];    }    for(i=start;i<=end;i++)        a[i]=b[i];}void mergesort(int start,int end) {    int middle;    if(start<end)    {        middle=(start+end)/2;        mergesort(start,middle);        mergesort(middle+1,end);        merge(start,middle,end);    }}int main(void){    srand(time(NULL));    int n;    scanf("%d",&n);    int i;    long long sum=0,temp;     for(i=0;i<n;i++)    {        scanf("%d",&a[i].height);        //a[i].height=rand();        //printf("%d ",a[i].height);        a[i].count=0;    }    //printf("\n");    mergesort(0,n-1);    for(i=0;i<n;i++)    {        if(a[i].count>0)        {        temp=(a[i].count+1)*a[i].count;        sum=sum+temp/2;        }       }    printf("%lld\n",sum);    return 0;}

如有不当之处欢迎指出!!

0 0
原创粉丝点击