C 超出时间限制spoj上出现错误。。如何改进我的解决方案?

C 超出时间限制spoj上出现错误。。如何改进我的解决方案?,c,C,我们得到一个数组a[1..N]。对于数组中的每个元素a[i],我们记下在当前元素之前出现的所有较小元素的总和。我需要计算数组中每个元素的总和 限制条件: 1您的实现非常简单,需要O(n^2)级的时间,但是为了让解决方案被接受,您必须像在合并排序中一样使用分治,与简单的排序算法(如冒泡排序等)相比,合并排序只需要O(NLogN)时间 为此,只需在Mergesort实现中添加2-3行代码,就可以稍微更改它。为了更好地理解数组中的倒数计数问题,()你会意识到,你必须简单地考虑在本质上相反的对,并添加所

我们得到一个数组
a[1..N]
。对于数组中的每个元素
a[i]
,我们记下在当前元素之前出现的所有较小元素的总和。我需要计算数组中每个元素的总和

限制条件:


1您的实现非常简单,需要O(n^2)级的时间,但是为了让解决方案被接受,您必须像在合并排序中一样使用分治,与简单的排序算法(如冒泡排序等)相比,合并排序只需要O(NLogN)时间

为此,只需在Mergesort实现中添加2-3行代码,就可以稍微更改它。为了更好地理解数组中的倒数计数问题,()你会意识到,你必须简单地考虑在本质上相反的对,并添加所有这些对的较小元素。例如,在一个数组1,4,2,5考虑4,2是反演,但我们必须考虑类似的2,5和1,2得到的解决方案。在每一对这样的组合中,不断添加左边的数字(仔细想想它是如何完成我们的工作的!!)

为了便于参考,请仔细阅读此合并排序代码,其中我做了一些小更改,以获得正确的可接受解决方案。(sum变量存储结果值)

#包括
#包括
长整和;
无效合并(长整型c[],长整型arr[],长整型起始,长整型中间,长整型结束)
{
长整型i=0,j=start,k=middle;

当((j这个问题似乎与数组中的倒数计数密切相关。对于已排序的数组,您可以轻松解决这个问题。因此,请使用通过合并排序计算倒数的技术,并适当减少和。这里有一个模糊的提示。您的解决方案:实解::气泡排序:实排序。如何改进气泡排序?
include 

int main()

{

long n,a[100000],i,j,sum;

printf("enter the number of elements");

  scanf("%ld",&n);

printf("enter the elements of the array");

for(i=0;i<n;i++)

      scanf("%ld",&a[i]);

sum=0;


for(i=1;i<n;i++)

     for(j=i-1;j>=0;j--)

         if(a[i]>a[j])

              sum+=a[j];

printf("\n%ld",sum);

return 0;

}
#include <stdio.h>
#include <stdlib.h>
long long int sum;
void merge(long long int c[],long long int arr[],long long int start,long long int middle,long long int end)
{
    long long int i=0,j=start,k=middle;
    while((j<middle)&&(k<end))
    {
        if(arr[j]<arr[k])
        {
            sum=sum+((end-k)*arr[j]);
            c[i]=arr[j];
            i++;j++;
        }
        else
        {
            c[i]=arr[k];
            i++;k++;
        }
    }
    while(j<middle)
    {
        c[i]=arr[j];
        i++;
        j++;
    }
    while(k<end)
    {
        c[i]=arr[k];
        i++;
        k++;
    }

}


void msort(long long int arr[],long long int start,long long int end)
{
    long long int middle=(start+end)/2;
    if((end-start)==1)
    {   return ;
    }
    msort(arr,start,middle);
    msort(arr,middle,end);
    long long int *c;
    c=(long long int*)malloc(sizeof(long long int)*(end-start));
    merge(c,arr,start,middle,end);
    long long int i,j=0;
    for(i=start;i<end;i++)
    {
        arr[i]=c[j];
        j++;
    }
}

void swap (long long int x[],long long int m,long long int n)
{
  long long int t= x[m];
  x[m]=x[n];
  x[n]=t;
}

int main()
{
    int t,i;
    long long int n,*arr,j;
    scanf("%d",&t);
    for(i=0;i<t;i++)
    {
        scanf("%lld",&n);
        arr = ( long long int * ) malloc ( sizeof(long long int) * n + 10);
        for(j=0;j<n;j++)
        {
            scanf("%lld",&arr[j]);

        }

        sum=0;  
        msort(arr,0,n);
//      for(j=0;j<n;j++)
//          printf("%lld ",arr[j]);
        printf("%lld\n",sum);
    }

    return 0;
}