在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。

如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。

收起

 

输入

第1行:N,N为序列的长度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)

输出

输出逆序数

输入样例

4
2
4
3
1

输出样例

4
试了一下,这道题应该给的是互不相同的n个数。
归并排序合并过程来完成。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define MAX 50000
#define DMAX 10000
using namespace std; int n,ar[MAX],ans;
void merge_sort(int l,int r) {
if(l == r) return;
int mid = (l + r) / 2;
merge_sort(l,mid);
merge_sort(mid + 1,r);
int *p = new int[r - l + 1];
int a = l,b = mid + 1,i = 0;
while(a <= mid || b <= r) {
if(b > r || a <= mid && ar[a] < ar[b]) {
p[i ++] = ar[a ++];
}
else {
p[i ++] = ar[b ++];
ans += mid - a + 1;
}
}
for(int i = l;i <= r;i ++) {
ar[i] = p[i - l];
}
}
int main() {
scanf("%d",&n);
for(int i = 0;i < n;i ++) {
scanf("%d",&ar[i]);
}
merge_sort(0,n - 1);
printf("%d",ans);
}

也可以用树状数组来实现。因为数很大,数组下标不能装,但是总的n个数,数组下标还是可以装的,所以把数用map映射到1-n,排好序之后,按照映射的下标排着找逆序数,注意这个时候的逆序数实际上是原来未排序时原来序列的正序数,所以用(n - 1) * n / 2减去就是答案。也可以存一下原序列,排序后再映射,然后按照原序列插入树状数组来计算。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#define MAX 50000
#define DMAX 10000
using namespace std;
typedef long long ll;
int n,ar[MAX];
ll ans;
int sum[MAX + 1];
map<int,int> mp;
int lowbit(int t) {return t&-t;}
void update(int x) {
while(x <= n) {
sum[x] ++;
x += lowbit(x);
}
}
int getsum(int x) {
int c = 0;
while(x > 0) {
c += sum[x];
x -= lowbit(x);
}
return c;
}
int main() {
scanf("%d",&n);
ans = (ll)(n - 1) * n / 2;
for(int i = 0;i < n;i ++) {
scanf("%d",&ar[i]);
mp[ar[i]] = i + 1;
}
sort(ar,ar + n);
for(int i = 0;i < n;i ++) {
ans -= getsum(mp[ar[i]] - 1);
update(mp[ar[i]]);
}
printf("%lld",ans);
}

51nod 1019 逆序数的更多相关文章

  1. 51nod 1019 逆序数(逆序数+离散化)

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.   如2 4 3 1中,2 1,4 3,4 1,3 1是 ...

  2. 51Nod 1019 逆序数(线段树)

    题目链接:逆序数 模板题. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a) ...

  3. (分治)51NOD 1019 逆序数

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.   如2 4 3 1中,2 1,4 3,4 1,3 1是 ...

  4. 51Nod 1019 逆序数 (归并排序)

    #include <iostream> #include <cstring> using namespace std; ; int a[maxn]; int res[maxn] ...

  5. 【51NOD-0】1019 逆序数

    [算法]离散化+树状数组(求逆序对) [题解]经典,原理是统计在i之前插入的且值≤i的个数,然后答案就是i-getsum(i) #include<cstdio> #include<a ...

  6. 51nod1019 逆序数

    1019 逆序数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为 ...

  7. 51nod 1107 斜率小于零连线数量 特调逆序数

    逆序数的神题.... 居然是逆序数 居然用逆序数过的 提示...按照X从小到大排列,之后统计Y的逆序数... 之后,得到的答案就是传说中的解(斜率小于零) #include<bits/stdc+ ...

  8. 51nod 1020 逆序排列

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1020 题意: 思路: 一开始用了三重循环... 设f(n,k)表示n个数 ...

  9. HDU3465 树状数组逆序数

    Life is a Line Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)T ...

随机推荐

  1. mongo的集群部署

    # MongoDB 集群部署 ## 关键词 * 集群 * 副本集 * 分片 ## MongoDB集群部署 >今天主要来说说Mongodb的三种集群方式的搭建Replica Set副本集 / Sh ...

  2. IDEA的Tomcat配置Web的项目创建以及Servlet简单运行。

    相关软件: 1.IDEA编译器 2.JDK 3.Tomcat          (相关软件都可以到官网上下载,老表提示:不要下载最新版本因为不要做试验品)   IDEA的安装非常简单,找好安装的盘,n ...

  3. NVML查询显卡信息

    前段时间做英伟达硬解得时候,显卡总是莫名挂掉,后来发现是因为显卡温度过高掉了.这几天找到CUDA中有NVML工具可以查看显卡信息,nvidia-smi也是基于这个工具包. 使用的CUDA版本为CUDA ...

  4. BZOJ 1003 [ZJOI2006]物流运输trans ★(Dijkstra + DP)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1003 思路 先Dijkstra暴力求出i..j天内不变换路线的最少花费,然后dp[i] = ...

  5. yum 数据库报错与重构

    [root@dhcp yum.repos.d]# cd /var/lib/rpm/ [root@dhcp rpm]# rm __db.* -rf[root@dhcp rpm]# rpm --rebui ...

  6. 快速切题 poj 2485 Highways prim算法+堆 不完全优化 难度:0

    Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23033   Accepted: 10612 Descri ...

  7. 通过网页或Serverice远程系统网站(服务)所在服务器本地的应用程序(未成功)

    近日接了一个奇葩需求,内容如题. 实现过程中遇到一些问题,特将实现过程记录于此,供备忘及参考. 首先尝试了正常启动进程的方法,代码如下: public string RunSPApp() { Proc ...

  8. 12.18 分布式系统下的session

    广义的session: 会话控制,可以理解成为一种保存key-value的机制 从key的方面来看:sessionId和token sessionId: 服务端请求客户端的时候,服务端通过setcoo ...

  9. 03_模拟DVD

    package com.entity; import java.text.SimpleDateFormat; import java.util.Date; public class DVD { pri ...

  10. Linux:tree命令详解

    tree 以树状图列出目录的内容 语法 tree(选项)(参数) 选项 -a:显示所有文件和目录: -A:使用ASNI绘图字符显示树状图而非以ASCII字符组合: -C:在文件和目录清单加上色彩,便于 ...