rt 代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=500050;
int a[maxn],top;
struct node
{
int l,r,mid;
int lson,rson;
ll num;
}s[64*maxn];
void update(int x)
{
s[x].num=s[s[x].lson].num+s[s[x].rson].num;
}
int ins(int x,int l,int u,int v)
{
if(x==0)x=++top;
s[x].l=u;
s[x].r=v;
s[x].mid=(u+v)>>1;
if(s[x].l==s[x].r)
{
s[x].num++;
return x;
}
if(l>s[x].mid)s[x].rson=ins(s[x].rson,l,s[x].mid+1,v);
else s[x].lson=ins(s[x].lson,l,u,s[x].mid);
update(x);
return x;
}
ll qry(int x,int l,int r)
{
if(x==0)return 0;
if(s[x].l>=l&&s[x].r<=r)return s[x].num;
if(l>s[x].mid)return qry(s[x].rson,l,r);
else if(r<=s[x].mid) return qry(s[x].lson,l,r);
else return qry(s[x].rson,l,r)+qry(s[x].lson,l,r);
}
int main()
{
int n,m,i,j,k,l,root=0;
ll sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
root=ins(root,a[i],1,1000000000);
sum+=(ll)i-qry(1,1,a[i]);
}
printf("%lld\n",sum);
}
权值线段树,没有离散化