小奇遐想 中石油5727 树状数组

方知今日书信未到
窗外三月天霁垂柳新长枝条
风中鸟啼犹带欢笑
——《清风醉梦》
小奇望着青天中的悠悠白云,开始了无限的遐想,在它的视野中,恰好有n朵高度不同的白云排成一排,他想从左到右选出四朵白云a,b,c,d,使得h_a<h_b<h_d<h_c,即看起来像是彩虹的形状!它想知道有多少种方案数。

输入

第一行包括1个整数n。
第二行包括n个整数,第i个正数表示h_i,保证这n个整数是n的一个全排列。

输出

输出一个整数表示答案。(mod 16777216)

解题思路:原本想直接计算abdc的方案数(a<b<c<d),比较难计算,后来大佬说可以先计算abxx,在计算abcd的数量就可以求出s(abdc)=s(abxx)-s(abdc); 比较简单的方法。

s(abxx):   用树状数组(lowbit)可以求出每次a[i]之前比它小的数sum[i],记录下来,同时,你可以找出这个数后面比它大的数的个数   temp[i]=n-a[i]-i+sum2[i]+1;后面从temp[i]中找两个数Cn/2=n*(n-1)/2;之后求和ans+=sum*cn/2;

s(abcd) : 首先要初始化树状数组中的值为零,然后知道sum[i],可计算s(abc)的值s(abcd)=s(abc)*(tenp[i]);

#include<stdio.h>
#include<queue>
#include<math.h>
#include<time.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<stack>
#define LL long long
#define mem(a,b) memset(a,b,sizeof(a))
#define lowbit(a) a&(-a)
#define shortime(a)  std::ios::sync_with_stdio(a);
using  namespace std;
const LL inf=16777216;
//long long cmp(node a,node b){ if(a.x==b.x) return a.r>b.r;return a.x>b.x;}
int maxn (int a,int b,int c){return max(max(a,b),max(b,c));}
int a[200005];
int sum[200005],sum2[200005],sum3[200006],n,temp[200005];
void plus1(int x,int ans)
{
    while(x<=n)
    {
        sum[x]+=ans;
        x+=x&(-x);
    }
}
long long tree (int x)
{
    long long ans=0;
    while(x>0)
    {
        ans+=sum[x];
        x-=x&(-x);
    }
    return ans;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    mem(temp,0);
    mem(sum2,0);
    mem(sum3,0);
    long long sum20=0;
    for(int i=1;i<=n;i++)
    {

        sum2[i]=tree(a[i]);
        temp[i]=n-a[i]-i+sum2[i]+1;
        sum20=(sum20+sum2[i]*(temp[i])*(temp[i]-1)/2)%inf;
        plus1(a[i],1);
    }
    long long sum30=0;
    mem(sum,0);
    for(int i=1;i<=n;i++)
    {

        sum30=(sum30+tree(a[i])*temp[i])%inf;
        plus1(a[i],sum2[i]);
    }
    //printf("%lld %lld\n",sum20,sum30);
    printf("%lld\n",(sum20-sum30+inf)%inf);
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_41485193/article/details/81280593