您的位置:首页 > 产品设计 > UI/UE

HOJ 2275 Number sequence(树状数组) 大于小于问题

2017-10-21 13:41 453 查看
题意:给定一个n个元素的数列,令Ai, Aj, Ak,使得 Ai < Aj > Ak 且 i < j < k这样的三个数为一组。求出一共有多少组。

要建立两次树状数组。
首先,我们插入数据进入树状数组时,用一个tmp1数组来记录每个数前面有几个小于它的。这样就保存了 Ai
< Aj 的数量了。
之后我们清空数组,再倒着插入一次,用tmp2数据记录每个数前面有几个小于它的。这样保证了Aj
> Ak的数量了。
我们一乘即可

#include<cstdio>  

#include<cstring>  

#include<algorithm>  

#include<iostream>  

using namespace std;  

#define M 35000  

#define N 50050  

#define ll long long  

#define lowbit(x) (x&-x)  

int tree[M];  

int num
;  

ll tmp
;  

int sum(int rt)  

{  

    int s=0;  

    while(rt>0){  

        s+=tree[rt];  

        rt-=lowbit(rt);  

    }  

    return s;  

}  

void update(int rt)  

{  

    while(rt<=M-1){  

        tree[rt]++;  

        rt+=lowbit(rt);  

    }  

}  

int main()  

{  

    int n;  

    while(~scanf("%d",&n)){  

        memset(tree,0,sizeof(tree));  

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

            scanf("%d",&num[i]);  

            num[i]++;  

        }  

        ll ans=0;  

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

            tmp[i]= sum(num[i]-1);  

            update(num[i]);  

        }  

        memset(tree,0,sizeof(tree));  

        for(int i=n;i>=1;i--)  

        {  

            ans+=tmp[i]*(ll)sum(num[i]-1);  

            update(num[i]);  

        }  

        printf("%lld\n",ans);  

    }  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐