贪心算法(修改时间和空间复杂度)

题目描述
午饭时间到了,同学们到食堂的窗口前排好了队伍,排队时间太长了,张同学无聊之际想到了一个问题,如果要编一个程序,输入每个人的身高(从最后一个同学开始输入,一直到排在第1位的挨着打菜窗口的同学,按照这个顺序输入),计算出每个人的前面能看到几个人,应该如何解决呢?

请注意:一个同学能够看到的人是在他前面且身高严格低于他的人,并且他的视线会被在他前面第一个身高大于等于他的人挡住。也就是说无论如何也无法看到再前面的人。

输入
输入N+1行

第一行一个正整数N表示同学的个数。

以下N行分别表示从后到前(窗口)同学的身高。

【数据范围】

30% 的数据1<=N<=100;

100%的数据1<=N<=80000,1<=第i个人的身高ai<=1000000000。

输出
一行一个整数,表示所有同学能看到的人的个数和。

#include<bits/stdc++.h>
using namespace std;
long long n,a[80005],o=0; 
int main(){
cin>>n;
for(int i=1;i<=n;i++)
    cin>>a[i];
for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++)
    {
        if(a[i]<=a[j])
            break;
        else o++;
    }    
cout<<o;
    return 0;
}  

会超时。

减少时间和空间复杂度。