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

如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. hdu 4857 逃生 拓扑排序+逆向建图

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Descr ...

  2. 简述<T> 与 <?>

    引 jdk1.5以后引入了泛型的概念,即:<>,规定了集合中元素类型 比如下面代码: List list1 = new ArrayList(); List<String> li ...

  3. Android------底部导航栏BottomNavigationBar

    Android 的底部导航栏 BottomNavigationBar 由Google官方Material design中增加的. Android底部导航栏的实现方式特别多,例如TabHost,TabL ...

  4. poj-2342-简单树形dp

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10388   Accepted: 594 ...

  5. POJ2104 (平方分割)二分查找理解。

    题意:任意区间求第k大数 思路: 预处理:利用平方分割(分桶法)把区间切割成B = sqrt(n)大小的一块块,然后每个各自排序. 二分第k大数x,接着就需要求[l,r]区间中x的排名,与k比较,将两 ...

  6. 基于vue-cli,测试非父子传值时,碰到 keep-alive的神奇

    非父子传值测试 一直都很好奇非父子传值到底如何,结果入坑许久才爬出来,才知道在脚手架里测试就是坑. 问题: 测试非父子传值时,由于组件之间是通过路由进行跳转,值传过去又被刷掉 思路: 因为路由跳转,相 ...

  7. 探究JS中的连等赋值问题

    一.引子 最近在看别人的博客时无意中看到一个这样的问题 var a = {n: 1}; var b = a; a.x = a = {n:2}; console.log(a.x); //undefine ...

  8. 二十二、utl_inaddr(用于取得局域网或Internet环境中的主机名和IP地址)

    1.概述 作用:用于取得局域网或Internet环境中的主机名和IP地址. 2.包的组成 1).get_host_name作用:用于取得指定IP地址所对应的主机名语法:utl_inaddr.get_h ...

  9. js 多个倒计时,毫秒倒计时

    其实主要是借鉴了了这篇文的写法(http://tuzwu.iteye.com/blog/819081),俺稍作了修改,以便更适合我的需要: 实现功能:调用一个函数,传入html元素的id,和一个截止时 ...

  10. Android 屏幕密度适配

    Android Icon Size and Location for Apps   分辨率 DPI Density scale 1dp对应像素 1dp对应物理尺寸 Location Icon Size ...