hdu1908 逆序对
2024-10-08 21:13:05
题目链接: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);
}
最新文章
- Java线程的概念
- ASP.NET Core--条件处理程序中的依赖注入
- 后台树状菜单,js实现递归无限分类
- dapper 学习
- Android上传头像代码,相机,相册,裁剪
- SharePoint API测试系列——对Recorded Item做OM操作(委托的妙用)
- hdu 3631
- c语言中的#ifndef、#def、#endif等宏是什么意思
- java实现文件传输
- MyBatis和Hibernate相比,优势在哪里?
- String为值类型还是引用类型
- web 应用常见安全漏洞
- Debian Security Advisory DSA-4421-1 chromium security update
- 起源-C的故事
- 第五讲 smart qq poll包处理 以及 私聊 群聊消息收发
- This network connection does not exist
- [2017BUAA软件工程]第0次作业
- SpringBoot使用外置的Servlet容器
- vue中使用echarts来绘制世界地图和中国地图
- mysql ON DUPLICATE KEY UPDATE重复插入时更新
热门文章
- ActiveMQ此例简单介绍基于docker的activemq安装与集群搭建
- Linux下无法生成core文件的解决办法
- Intellij IDEA创建 Web 项目
- Eclipse如何打开Android工程
- 为什么我们要让人工智能玩游戏:微软Project AIX
- Linux统计目录下文件个数及代码行数
- 聊聊RabbitMQ那一些事儿之一基础应用
- 小白自学机器学习----3.令人头秃的pytorch安装 (No module named &#39;tools.nnwrap&#39; 错误)
- 前端每日实战:34# 视频演示如何用纯 CSS 创作在文本前后穿梭的边框
- 使用NPOI将Excel表导入到数据库中