这题是一个简单的分治合并。
我最想说的是本来我半年前就做出来这题的,可是找了很久的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;
}
如有不当之处欢迎指出!!