HOJ 2275 Number sequence

来源:互联网 发布:域名举报需要多少人 编辑:程序博客网 时间:2024/06/05 23:50

Number sequence


题目链接:点击打开链接


解题思路:维护两个数组,一个记录 Aj 前面有几个比它小的,另一个记录 Aj 后面有几个比它小的,由于 Aj 前面和后面的数都满足 i<j<k;而且已经统计了前后比它小的数,相乘做个组合,求和就是最后结果,注意树状数组下标为零的情况。


#include <cstring>#include <cstdio>#include <algorithm>#include<math.h>using namespace std;#define MAXN 50005int n;int tree[32780];int data[MAXN];int a[MAXN];int b[MAXN];void add(int x,int num){    for(int i=x;i<=32780;i+=i&-i)        tree[i]+=num;}int read(int x){    int sum=0;    for(int i=x;i>0;i-=i&-i)        sum+=tree[i];    return sum;}int main(){    long long sum;    while(~scanf("%d",&n))    {        sum=0;        for(int i=0;i<n;i++)        {           scanf("%d",&data[i]);           data[i]++;   //避开0位置        }        memset(tree,0,sizeof(tree));        for(int i=0;i<n;i++)        {            a[i]=read(data[i]-1);            add(data[i],1);        }        memset(tree,0,sizeof(tree));        for(int i=n-1;i>=0;i--)        {            b[i]=read(data[i]-1);   //要统计前面比data[i]小的数,避开0            add(data[i],1);        }        for(int i=0;i<n;i++)           sum+=(long long)a[i]*(long long)b[i];        printf("%lld\n",sum);    }    return 0;}


0 0
原创粉丝点击