HDU2492 Ping pong

来源:互联网 发布:金融软件开发待遇 编辑:程序博客网 时间:2024/05/21 17:30

树状数组入门题  算出前缀和再逆序算出后缀和

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int c[100005],s[20005],num[20005],ss[20005];int n;int lowbit(int x){    return x&(-x);}void add(int ai,int t){    while(ai<=100000)    {        c[ai]+=t;        ai+=lowbit(ai);    }}int sum(int x){    int ret=0;    while(x>0)    {         ret+=c[x];          x-=lowbit(x);    }    return ret;}int main(){    int xi;    scanf("%d",&xi);    while(xi--)    {        memset(c,0,sizeof c);        memset(s,0,sizeof s);        memset(ss,0,sizeof ss);        memset(num,0,sizeof num);        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%d",&num[i]);            add(num[i],1);            s[i]=sum(num[i]-1);        }        memset(c,0,sizeof c);        for(int i=n;i>=1;i--)        {            add(num[i],1);            ss[i]=sum(num[i]-1);        }         __int64 ans=0;        for(int i=2;i<n;i++)        {            ans+=(__int64)(s[i])*(__int64)(n-ss[i]-i);            ans+=(__int64)(ss[i])*(__int64)(i-1-s[i]);        }        printf("%I64d\n",ans);    }}


0 0
原创粉丝点击