#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,c[500010];
long long ans;//插入当前这个数在原序列的位置,然后往上更新,当要计算逆序对的时候,当前这个数等于多少就说明前面插入过多少个数
struct point{
long long val,num;
}a[500010];
inline bool cmp(point q,point w)
{
if(q.val==w.val)
return q.num<w.num;
return q.val<w.val;
}
inline void insert(int p,int d)
{
for(;p<=n;p+=p&-p)
c[p]+=d;
}
inline int query(int p)
{
int sum=0;
for(;p;p-=p&-p)
sum+=c[p];
return sum;
}
int main()
{
// freopen("P1908.in","r",stdin);
scanf("%lld",&n);
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i].val),a[i].num=i;
sort(a+1,a+1+n,cmp);
for(long long i=1;i<=n;i++)
{
insert(a[i].num,1);
ans+=i-query(a[i].num);//已经包含自己
}
printf("%lld",ans);
return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef int ll;
ll n,c[500010],ans;//插入当前这个数在原序列的位置,然后往上更新,当要计算逆序对的时候,当前这个数等于多少就说明前面插入过多少个数
struct point{
ll val,num;
}a[500010];
inline bool cmp(point q,point w)
{
if(q.val==w.val)
return q.num<w.num;
return q.val<w.val;
}
inline void insert(int p,int d)
{
for(;p<=n;p+=p&-p)
c[p]+=d;
}
inline int query(int p)
{
int sum=0;
for(;p;p-=p&-p)
sum+=c[p];
return sum;
}
int main()
{
// freopen("P1908.in","r",stdin);
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i].val),a[i].num=i;
sort(a+1,a+1+n,cmp);
for(ll i=1;i<=n;i++)
{
insert(a[i].num,1);
ans+=i-query(a[i].num);//已经包含自己
}
printf("%lld",ans);
return 0;
}
用了typedef50分,不用就AC了,不知道为什么 题号是P1908