AT_agc023_e [AGC023E] Inversions 题解

ci=j=1n[aji]n+i 表示 i 可选的位置数,

则符合要求的排列共有 s=i=1nci 种,若 ci=0 显然答案为 0

考虑每对位置 i,j|i<j 在多少排列中是逆序对。先考虑 aiaj 的情况。

此时 pj<piai,于是令 ajai,发现此时 i,j 是逆序对与顺序对的方案数相等,且 k(ai,aj],ck 减少 1

所以此时 i,jS2k=ai+1ajck1ck 个排列中是逆序对。

考虑预处理 di=j=1icj1cj,则 S2k=ai+1ajck1ck=Sdaj2dai 吗?

实际上并不是,考虑 ck1ck0,而 dai,daj 中有 0 的情况。

改变 di 的定义为 di=j=1,cj1icj1cj,设 li 表示 i 前第一个 ci=1 的位置,

考虑枚举 j,则 j 的贡献为 S2i=lajajk=i+1ajck1ck=S2i=lajajdajdi,此时保证了 ilaj,所以式子成立。

a 值为 i 的位置要求在 j 之前,所以树状数组维护。

ai>aj 倒着做一遍。

#include <cstdio>
#include <cstring>
#define M 1000000007
#define int long long
int n, s, q, a[200050], c[200050], d[200050], l[200050];
int P(int x, int y)
{
    int q = 1;
    for (; y; y >>= 1, x = x * x % M)
        if (y & 1)
            q = q * x % M;
    return q;
}
struct T
{
    int c[200050];
    void C(int x, int k)
    {
        for (; x <= n; x += x & -x)
            c[x] = (c[x] + k) % M;
    }
    int Q(int x, int y)
    {
        int q = 0;
        for (x -= !!x; y > x; y &= y - 1)
            q = (q + c[y]) % M;
        for (; x > y; x &= x - 1)
            q = (q + M - c[x]) % M;
        return q;
    }
} C, D;
signed main()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%lld", a + i), ++c[a[i]];
    for (int i = n; i; --i)
        c[i] += c[i + 1];
    for (int i = 1; i <= n; ++i)
        if (!(c[i] -= n - i))
            return !puts("0");
    d[0] = s = 1;
    for (int i = 1; i <= n; ++i)
    {
        s = s * c[i] % M;
        d[i] = d[i - 1] * P(c[i], M - 2) % M;
        if (c[i] == 1)
            l[i] = i;
        else
            d[i] = d[i] * (c[i] - 1) % M, l[i] = l[i - 1];
    }
    for (int i = 1; i <= n; ++i)
        q = (q + s * P(2, M - 2) % M * d[a[i]] % M * C.Q(l[a[i]], a[i])) % M, C.C(a[i], P(d[a[i]], M - 2));
    memset(C.c, 0, sizeof C.c);
    for (int i = n; i >= 1; --i)
        q = (q + s * D.Q(1, a[i] - 1) % M + M - s * P(2, M - 2) % M * d[a[i]] % M * C.Q(l[a[i]], a[i] - 1) % M) % M, C.C(a[i], P(d[a[i]], M - 2)), D.C(a[i], 1);
    printf("%lld", q);
    return 0;
}
posted @   Jijidawang  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示