码迷,mamicode.com
首页 > 编程语言 > 详细

HOJ 2275 Number sequence(树状数组)

时间:2015-02-23 10:53:06      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

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

思路:可以用树状数组,每次输入一个Ai,可以查询到之前输入的比它小或比它大的有多少组,之后输入的就不得而知了,所以可以开个数组记录下来逆序再建树一次即可
另外数的范围取到了0,所以每个数要自加一次,而且组数是longlong的,而且HOJ的服务器系统支持的是lld,不是i64d..wa了几次
#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[N];
ll tmp[N];
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;
}


HOJ 2275 Number sequence(树状数组)

标签:

原文地址:http://blog.csdn.net/kalilili/article/details/43915671

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!