1 条题解

  • 1
    @ 2025-4-6 18:47:22

    树状数组求逆序对。

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=99999997;
    int n,d[100001],e[100001],f[100001];
    long long a[100001],b[100001],c[100001];
    bool cmpe(int x,int y)
    {
        return a[x]<a[y];
    }
    bool cmpf(int x,int y)
    {
        return b[x]<b[y];
    }
    long long query(int x)
    {
    	long long ans=0;
    	for (int i=x;i>0;i-=i&-i)
    		ans=(ans+c[i])%mod;
    	return ans;
    }
    void add(int x,long long k)
    {
    	for (int i=x;i<=n;i+=i&-i)
    		c[i]=(c[i]+k)%mod;
    	return;
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;++i)
            scanf("%lld",&a[i]),e[i]=i;
        for (int i=1;i<=n;++i)
            scanf("%lld",&b[i]),f[i]=i;
        sort(e+1,e+n+1,cmpe);
        sort(f+1,f+n+1,cmpf);
        for (int i=1;i<=n;++i)
            d[e[i]]=f[i];
        long long ans=0;
        for (int i=n;i>0;--i)
        {
            add(d[i],1);
            ans=(ans+query(d[i]-1))%mod;
        }
        printf("%lld",ans);
        return 0;
    }
    
    • 1

    信息

    ID
    145
    时间
    1000ms
    内存
    128MiB
    难度
    9
    标签
    递交数
    7
    已通过
    5
    上传者