UVALive 4329 Ping pong(解法二:树状数组)

来源:互联网 发布:mac pdg转pdf 编辑:程序博客网 时间:2024/06/07 03:04
思路详解参见:http://blog.sina.com.cn/s/blog_691ce2b70101lolv.html

这里用树状数组实现,时间要快很多。


//0 KB113 ms#include <stdio.h>#include <string.h>#define lowbit(x) (x &(-x))const int M = 100005;const int N = 20005;int ar[M],val[N],lmin[N],rmin[N];void add (int x){    while (x <= M)    ar[x] += 1,x += lowbit(x);}int sum(int x){    int res  = 0;    while (x > 0)        res += ar[x],x -= lowbit(x);    return res;}int main (){    int T,n,i;    scanf ("%d",&T);    while (T--)    {        scanf ("%d",&n);        memset (ar,0,sizeof(ar));        for (i = 1;i <= n;i ++)        {            scanf ("%d",&val[i]);            add(val[i]);            lmin[i] = sum(val[i]-1);        }        memset (ar,0,sizeof(ar));        for (i = n;i >= 1;i --)        {            add(val[i]);            rmin[i] = sum(val[i]-1);        }        //for (i = 1;i <= n;i ++)         //   printf ("%d %d\n",lmin[i],rmin[i]);        long long ans = 0;        for (i = 1;i <= n;i ++)            ans += lmin[i]*(n-i-rmin[i])+(i-lmin[i]-1)*rmin[i];        printf ("%lld\n",ans);    }    return 0;}


原创粉丝点击