hdu 5147 Sequence II BestCoder Round #23 1002

头疼,无心学习,做一题舒爽一下身心

题意:给1-n n个数的随机排列,求满足( 1a<b<c<dn 2.  Aa<Ab  3.  Ac<Ad )数列的个数

分析:1.发现好似树状数组的题,并且有序对Aa Ab 和 有序对Ac Ad貌似可以分开来思考

   2.对于满足条件的有序对Aa,Ab的个数,Aa只需要保存Aa的个数,那也就是1,可以直接用树状数组来求

   3.那对于有序对Ac和Ad呢,不仅仅要求出Ac,Ad的个数,还要与有序对Aa,Ab产生联系

           4.枚举Ac,并且Ac保存Ac之前序列有序对Aa,Ab的个数。

   5.所以可以在求每一个有序对Ac,Ad的同时求出Ac之前序列有序对Aa,Ab的个数


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
#define MAXN 50010
#define lowbit(i) ((i) & (-i))
LL pre2[MAXN],pre1[MAXN];
int arr[MAXN];
inline LL sum(int i,LL * cur)
{
    LL ans = 0;
    for(;i;i -= lowbit(i))
        ans += cur[i];
    return ans;
}
inline void modify(int i,int maxn,LL key,LL * cur)
{
    for(;i <= maxn;i += lowbit(i))
        cur[i] += key;
}
int main()
{
    int _,n;
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d",&n);
        for(int i = 0;i < n;i++)
            scanf("%d",&arr[i]);
        memset(pre1,0,8 * n + 20);
        memset(pre2,0,8 * n + 20);
        LL prefix = 0,ans = 0;
        for(int i = 0;i < n;i++)
        {
            modify(arr[i],n,prefix,pre2);
            prefix += sum(arr[i],pre1);
            modify(arr[i],n,1,pre1);
            ans += sum(arr[i] - 1,pre2);
        }
        printf("%I64d\n",ans);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值