运行超时过不了,怎么办?


#include
using namespace std;
int ans,n,j=3,k;
int main()
{
    scanf("%d",&n);
    int a[n+1];
    for(int i=1;i<=n;++i)scanf("%d",&a[i]); 
    for(int i=1;i<=n;++i)for(int j=1+i;j<=n;++j)if(a[i]>a[j])++ans;
    printf("%d",ans);
    return 0; 
}

题目描述:
给定一个序列a1,a2,…,an,如果存在iaj,那么我们称之为逆序对,求逆序对的数目。
样例:
4
3
2
3
2
输出:3
问题:
自己在软件上运行并没有什么问题,但是提交之后却判的错,原因是运行超时,有什么办法可以解决?
题目网址:http://ybt.ssoier.cn:8088/problem_show.php?pid=1311

n的范围是1e5,也就是10的5次方,两个for循环的时间复杂度是1e5 * 1e5 = 1e10, 计算机每秒大约可以运行5e8,所以运行大约需要20s,而时间限制是1000ms = 1s,所以就超时了。

你需要了解时间复杂度的概念,然后学习一个更快的算法(nlog(n))( 比如 通过“归并排序求逆序数”,或通过“线段树求逆序数”)

int a[n+1];这里的n是几,没有定义啊。。那这个for(int i=1;i<=n;++i)是不是无效