HOJ 2275 Number sequence(树状数组)

来源:互联网 发布:linux终端连接redis 编辑:程序博客网 时间:2024/05/23 19:22

题意:给定一个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;}


0 0
原创粉丝点击