题目链接:https://www.luogu.com.cn/problem/P1908

这个题不要以为拿到手就可以树状数组秒,本题的数据范围是1e9显然简单的树状数组是空间不够的,点个数有5e5,所以离散化之后用树状数组还是可以的,但是有没有更简明的方法呢?这就说到一种高效的排序方式mergesort了,这是一种分治算法,先排左边部分的数组,再改变后边部分的数组,最后将左右的数组合起来就可以获得排序后的数组,时间复杂度是O(nlogn),克难攻坚复杂度是O(n),所以非常高效,在排序的过程中,左边和右边部分已经排序好,这个时候就会检索两半边的元素,当左边取出的元素a[i]比右边取出的元素b[j]大时,因为左边的数组是有序的,所以我们很容易知道此时有[i,mid]区间内的数都是比b[j]大的,也就是mid-i+1个数,这样递归下去就可以求得逆序对的数量。

代码如下:

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
const int maxn=1e6+;
int n,m,t;
int a[maxn],b[maxn];
ll ans=;
void mergesort(int* a,int l,int r)
{
if(l==r) return;
int m=l+r>>;
mergesort(a,l,m);
mergesort(a,m+,r);
int i=l,j=m+,cnt=l;
while(i<=m&&j<=r)
{
if(a[i]<=a[j])b[cnt++]=a[i++];
else ans+=m-i+,b[cnt++]=a[j++];
}
while(i<=m)b[cnt++]=a[i++];
while(j<=r)b[cnt++]=a[j++];
f(i,l,r)a[i]=b[i];
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
scan(n);
f(i,,n-)scan(a[i]);
mergesort(a,,n-);
// f(i,0,n-1)pf("%d ",a[i]);
// pf("\n");
pf("%lld",ans);
}

最新文章

  1. Java线程的概念
  2. ASP.NET Core--条件处理程序中的依赖注入
  3. 后台树状菜单,js实现递归无限分类
  4. dapper 学习
  5. Android上传头像代码,相机,相册,裁剪
  6. SharePoint API测试系列——对Recorded Item做OM操作(委托的妙用)
  7. hdu 3631
  8. c语言中的#ifndef、#def、#endif等宏是什么意思
  9. java实现文件传输
  10. MyBatis和Hibernate相比,优势在哪里?
  11. String为值类型还是引用类型
  12. web 应用常见安全漏洞
  13. Debian Security Advisory DSA-4421-1 chromium security update
  14. 起源-C的故事
  15. 第五讲 smart qq poll包处理 以及 私聊 群聊消息收发
  16. This network connection does not exist
  17. [2017BUAA软件工程]第0次作业
  18. SpringBoot使用外置的Servlet容器
  19. vue中使用echarts来绘制世界地图和中国地图
  20. mysql ON DUPLICATE KEY UPDATE重复插入时更新

热门文章

  1. ActiveMQ此例简单介绍基于docker的activemq安装与集群搭建
  2. Linux下无法生成core文件的解决办法
  3. Intellij IDEA创建 Web 项目
  4. Eclipse如何打开Android工程
  5. 为什么我们要让人工智能玩游戏:微软Project AIX
  6. Linux统计目录下文件个数及代码行数
  7. 聊聊RabbitMQ那一些事儿之一基础应用
  8. 小白自学机器学习----3.令人头秃的pytorch安装 (No module named &#39;tools.nnwrap&#39; 错误)
  9. 前端每日实战:34# 视频演示如何用纯 CSS 创作在文本前后穿梭的边框
  10. 使用NPOI将Excel表导入到数据库中