#include <cstdio>
#include <iostream>
#include <algorithm>
typedef long long LL;
using namespace std;
const int maxn = 1e5+6,mod = 99999997;
int n,Rank[maxn],Sort[maxn];LL ans;
struct qwq{
LL val;int pos;
bool operator < (const qwq &C)const
{
if(val != C.val)
return val < C.val;
else return pos < C.pos;
}
}a[maxn],b[maxn];
void mergesort(int l,int r)
{
if(l == r) return;
int mid = (l + r) >> 1;
mergesort(l,mid);mergesort(mid+1,r);
int i = l,j = mid + 1,k = l;
while(i <= mid && j <= r)
{
if(Rank[i] <= Rank[j])
Sort[k++] = Rank[i++];
else
{
Sort[k++] = Rank[j++];
ans += (LL)mid - i + 1;
ans %= mod;
}
}
while(i <= mid)
Sort[k++] = Rank[i++];
while(j <= r)
Sort[k++] = Rank[j++];
for(int pos=l;pos<=r;pos++)
Rank[pos] = Sort[pos];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i].val);
a[i].pos = i;
}
for(int i=1;i<=n;i++)
{
scanf("%lld",&b[i].val);
b[i].pos = i;
}
sort(a+1,a+n+1);sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
Rank[a[i].pos] = b[i].pos;
mergesort(1,n);
printf("%lld",ans);
return 0;
}
#include <cstdio>
#include <iostream>
#include <algorithm>
typedef long long LL;
using namespace std;
const int maxn = 1e5+6,mod = 99999997;
int n,Rank[maxn];LL ans,tree[maxn];
struct qwq{
LL val;int pos;
bool operator < (const qwq &C)const
{
if(val != C.val)
return val < C.val;
else return pos < C.pos;
}
}a[maxn],b[maxn];
int lowbit(int k)
{
return k & -k;
}
void add(int x,int k)
{
for(;x<=n;x+=lowbit(x))
tree[x] += k;
return ;
}
LL sum(int x)
{
LL res = 0;
for(;x;x-=lowbit(x))
res += tree[x];
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i].val);
a[i].pos = i;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i].val);
b[i].pos = i;
}
sort(a+1,a+n+1);sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
Rank[a[i].pos] = b[i].pos;
for(int i=1;i<=n;i++)
{
add(Rank[i],1);
ans += i - sum(Rank[i]);
ans %= mod;
}
printf("%lld",ans);
return 0;
}
原文:https://www.cnblogs.com/-Wind-/p/11847596.html