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

 
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
Input
第1行:N,N为序列的长度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
Output
输出逆序数
Input示例
4
2
4
3
1
Output示例
4

思路:
  本题的题意较为简单,起初一组数中的逆序对的数量。其中的关键是对离散化的理解。离散化在这个过程中感觉更像是在记录了原来的先后顺序的情况下按照数值大小再次排序,这样在判断逆序对的时候可以以n的复杂度顺序判断,而不需要n^2判断。 AC代码:
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=;
int n; int hash[maxn]; struct Node{
int s,v;
}node[maxn]; int tree[maxn]; bool cmp(Node a,Node b){
return a.v<b.v;
} int lowbit(int i){
return i&(-i);
} void add(int x,int v){
for(int i=x;i<=n;i+=lowbit(i)){
tree[i]+=v;
}
} int getsum(int i){
int s=;
while(i>){
s+=tree[i];
i-=lowbit(i);
}
return s;
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&node[i].v);
node[i].s=i;
} //离散化 ,hash[i]里存的是v的值为i的node在全部node中以v排序后的排名 (由小到大)
sort(node+,node++n,cmp);
for(int i=;i<=n;i++){
hash[node[i].s]=i;
}
int res=;
for(int i=;i<=n;i++){
add(hash[i],);
res+=i-getsum(hash[i]);
} cout<<res; return ;
}

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. 1019.Line Painting(线段树 离散化)

    1019 离散化都忘记怎么写了 注意两个端点 离散化后用线段树更新区间 混色为-1  黑为2  白为1  因为N不大 最后直接循环标记这一段的颜色查找 #include <iostream> ...

  6. 51nod 1206 && hdu 1828 Picture (扫描线+离散化+线段树 矩阵周长并)

    1206 Picture  题目来源: IOI 1998 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 给出平面上的N个矩形(矩形的边平行于X轴 ...

  7. PHP 数字序数&字母序数 相互转化

    序数从1开始  即 A=1  而非 A=0 /** * 数字序列转字母序列 * @param $int * @param int $start * @return string|bool */ fun ...

  8. HDU 1394 Minimum Inversion Number(最小逆序数 线段树)

    Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...

  9. SPOJ:Another Version of Inversion(二维数组的逆序对)

    DCE Coders admins are way much geekier than they actually seem! Kartik has been following that tradi ...

随机推荐

  1. Sed - An Introduction and Tutorial by Bruce Barnett

    http://www.grymoire.com/unix/sed.html Quick Links - NEW Sed Commands : label # comment {....} Block ...

  2. ExtJs6内嵌iframe,nginx部署本地前台文件

    /** * Created by Wwei on 2016/9/1. */ Ext.define('Admin.view.photo.CADMultiUploadForm', { extend: 'E ...

  3. [转载+原创]Emgu CV on C# (五) —— Emgu CV on 局部自适应阈值二值化

    局部自适应阈值二值化 相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测. 一.理论概述(转载自< ...

  4. PHP学习5——异常处理

    主要内容: PHP错误类型 异常的产生 错误日志 日志信息记录到操作系统日志 异常处理 扩展异常处理类 PHP错误类型 语法错误 执行时错误 逻辑错误 异常的产生 如果安装了xampp之后,在php. ...

  5. Make sure that the controller has a parameterless public constructor.

    An error occurred when trying to create a controller of type 'CCD.Web.Controllers.TWAccountControlle ...

  6. 懒汉单例安全basedao

    package Dao; import java.sql.*; public class BaseDao { private String drname = "com.mysql.jdbc. ...

  7. form表单在发送到服务器时候编码方式

    enctype(编码方式):规定了form表单在发送到服务器时候编码方式.有如下的三个值可选: 1.application/x-www-form-urlencoded.默认的编码方式.但是在用文本的传 ...

  8. RabbitMQ如何解决各种情况下丢数据的问题

    1.生产者丢数据 生产者的消息没有投递到MQ中怎么办?从生产者弄丢数据这个角度来看,RabbitMQ提供transaction和confirm模式来确保生产者不丢消息. transaction机制就是 ...

  9. 设计模式入门,装饰着模式,c++代码实现

    // test03.cpp : Defines the entry point for the console application.////设计模式第3章 装饰者模式#include " ...

  10. thinkphp多表联合查询

    1.两个表查询 $userid=session('user.id'); $user = M('cuser'); $data = $user->field('projectno')->whe ...