HDU2492

来源:互联网 发布:收单数据保密协议 编辑:程序博客网 时间:2024/05/23 01:56

AC代码:

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using namespace std;const int ma = 100000;int m[ma];int lmax[ma],lmin[ma], rmax[ma], rmin[ma];int cnt[ma<<2];int lowbit(int t){    return t & -t;//取出t中的最后一个1}int sum(int end){    int s = 0;    while(end > 0){        s += cnt[end];        end -= lowbit(end);    }    return s;}void update(int pos){    while(pos <= ma){        cnt[pos]++;        pos += lowbit(pos);    }}int main(){    int t, n;    scanf("%d", &t);    while(t--){        scanf("%d", &n);        for(int i =1; i<=n; i++)            scanf("%d", &m[i]);        memset(lmax, 0, sizeof(lmax));        memset(lmin, 0, sizeof(lmin));        memset(rmax, 0, sizeof(rmax));        memset(rmin, 0, sizeof(rmin));        memset(cnt, 0, sizeof(cnt));        for(int i =1; i<=n; i++){            update(m[i]);            lmax[i] = sum(ma) - sum(m[i]);//计算左边大的个数            lmin[i] = sum(m[i]-1);//计算左边小的个数        }        memset(cnt, 0, sizeof(cnt));        for(int i=n; i>=1; i--){            update(m[i]);            rmax[i] = sum(ma) - sum(m[i]);//计算右边大的个数            rmin[i] = sum(m[i]-1);//计算右边小的个数        }        long long ans=0;        for(int i=1; i<=n; i++) {           ans += lmax[i]*rmin[i] + lmin[i]*rmax[i];        }        printf("%I64d\n", ans);    }    return 0;}


0 0
原创粉丝点击