记录编号 |
443732 |
评测结果 |
AAAAAAAAAA |
题目名称 |
排序工作量-加强版 |
最终得分 |
100 |
用户昵称 |
123 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.111 s |
提交时间 |
2017-08-31 21:52:04 |
内存使用 |
7.94 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <stdio.h>
using namespace std;
int q[1000012],ya[1000012];
int n,d=0;
int hh(int u){return u&-u;}
void insert(int u)
{
if(u==0)return;///啊啊,竟然还有0
while(u<=d+10)
{
q[u]++;
u+=hh(u);
}
}
int find(int u)
{
long long ans=0;
while(u>0)
{
ans+=q[u];
u-=hh(u);
}
return ans;
}
int main(){
freopen ("px.in","r",stdin);
freopen ("px.out","w",stdout);
int a,b,c,e;
long long ans=0;
scanf("%d",&n);
for(a=1;a<=n;a++)
{
scanf("%d",&ya[a]);
d=max(d,ya[a]);
}
for(a=1;a<=n;a++)
{
ans+=find(d+10)-find(ya[a]);//求逆序对find(n)-find(ya[a])就是在当前插入的这个点之前大于ya[a]的值的个数
insert(ya[a]);//插入当前这个点到q中;
}
printf("%lld",ans);
return 0;
}