1 条题解
-
1
树状数组求逆序对。
#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
- 上传者