5727: 小奇遐想

5727: 小奇遐想

时间限制: 1 Sec  内存限制: 128 MB
提交: 243  解决: 44
[提交] [状态] [讨论版] [命题人:admin]

题目描述

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

输入

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

输出

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

样例输入

5
1 5 3 2 4

样例输出

0

提示

对于10%的数据n<=600;对于40%的数据n<=5000;
对于100%的数据n<=200000。

看了半天终于把代码看懂了

要求的是找4个数,a,b,c,d

但是要求a<b<d<c

那么,先求一个abx1x2,就是说求一个a<b<x1,a<b<x2-----------x1,x2大小待定

然后呐,减去x2>x1的情况就可以了

求abx1x2的时候才用树状数组思想和之前的求逆序数有点类似

枚举b,for i 0--n

对于一个a【i】,l【i】表示a【i】之前有多少个比b小的数,r【i】表示后面有多少个比b小的数,

那么,对于其中一个a【i】来说,满足条件的有,左边比它小的数的个数*1*右边比它大的数个数*(右边比它大的数个数-1)

然后求x2>x1的情况,这样的话枚举第三个数,那么ab这俩数的可能就是a【i】之前所有l【】的和,第四个数的可能就是比它大的数的个数

最终减一下就行了

代码源自这里、,改掉了我看不懂的&(p-1)

#include<bits/stdc++.h>
#define inf 1000000000
#define ll long long
#define P 16777216
using namespace std;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int n,res;
int a[200005];
ll l[200005],r[200005],t[200005];
void add(int x,int val)
{
    for(int i=x; i<=n; i+=i&-i)
        t[i]+=val;
}
ll query(int x)
{
    ll res=0;
    for(int i=x; i; i-=i&-i)
        res+=t[i];
    return res;
}
void pre()
{
    for(int i=1; i<=n; i++)
    {
        l[i]=query(a[i]);
        r[i]=a[i]-l[i]-1;
        add(a[i],1);
    }
}
int cal1()//12xx
{
    ll res=0;
    for(int i=1; i<=n; i++)
        res=(res+l[i]*(n-i-r[i])*(n-i-r[i]-1)/2)%P;
    return res;
}
int cal2()//1234
{
    memset(t,0,sizeof(t));
    ll res=0;
    for(int i=1; i<=n; i++)
    {
        res=(res+query(a[i])*(n-i-r[i]))%P;
        add(a[i],l[i]);
    }
    return res;
}
int main()
{
    n=read();
    for(int i=1; i<=n; i++)
        a[i]=read();
    pre();
    printf("%d",(cal1()-cal2()+P)%P);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/du_mingm/article/details/81257320