题意 : 有一个n个数的数列且元素都是0~n-1,问你将数列的其中某一个数及其前面的数全部置到后面这种操作中(比如3 2 1 0中选择第二个数倒置就产生1 0 3 2)能产生的最少的逆序数对是多少?

分析 : 首先铁定排除枚举法,直接暴力肯定是超时的。既然这样不妨来找找规律,从第一个数开始,如果我们将第一个数放到末尾,根据逆序数的特点,能够推断出当前总逆序数应该是减少了arr[i]并增加了(n-1)-arr[i] (这里arr[i]代表这个数后面有多少个数小于它),如果细心一点,可以发现不管是从第几个数开始,都是由我们刚刚所说的将第一个数放到末尾构造而来,比如 1 2 3 4 我们将第二个数开始放到末尾就是 3 4 1 2,同样是可以这样构造而来,就是先将第一个数放到末尾产生一个序列 2 3 4 1,然后又进行一次将第一个数放到末尾产生3 4 1 2,这样根据我们之前得到的结论,只要知道当前序列的逆序数对和arr[i],我们就能递推出下一个序列的逆序数对。那么现在关键就是arr[i]怎么快速求?还记得序列是个0~n-1的序列嘛,实际上arr[i]就等于当前在头部的这个数的值,比如 2 1 3 0 在头部的是2,那么后面就有2个比它小的数!所以最终要得到答案我们只要一开始算出原始序列的逆序数对就能够O(n)的枚举了!

#include<bits/stdc++.h>
#define lowbit(i) (i&(-i))
using namespace std;
;
int c[maxn];
int top, n;
void add(int i, int val)
{
    while(i <= n){
        c[i] += val;
        i += lowbit(i);
    }
}
int sum(int i)
{
    ;
    ){
        ret += c[i];
        i -= lowbit(i);
    }
    return ret;
}
int arr[maxn];
int main(void)
{
    while(~scanf("%d", &n)){
        top = n;
        memset(c, , sizeof(c));
        memset(arr, 0x3f, sizeof(arr));
        ;
        ; i<n; i++){
            int tmp;
            scanf("%d", &arr[i]);
            arr[i]+=;//树状数组小心0的陷阱!
            SUM += i - sum(arr[i]);//累计求出初始序列的逆序数对
            add(arr[i], );
        }
        int ans = SUM;
        ; i<n; i++){
            ans = min(SUM, ans);
            SUM += n - arr[i] - (arr[i] - );//递推构造
        }
        printf("%d\n", ans);
    }
    ;
}

瞎 : 面对这种操作很明显有规律的,就要赶快先实验前几次操作,找找规律,再想想能不能递推,题目给出的序列的任何一个性质都是有用的,比如这里的0~n-1,以后遇到类似的题就把能得到的性质全部列出来,把每一步操作能得到的结果和特点综合分析,不能瞎想.....

HDU 1394 Minimum Inversion Number (树状数组 && 规律 && 逆序数)的更多相关文章

  1. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  2. HDU 1394 Minimum Inversion Number (树状数组求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多 ...

  3. hdu 1394 Minimum Inversion Number - 树状数组

    The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...

  4. [hdu1394]Minimum Inversion Number(树状数组)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

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

    HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意:  给一个序列由 ...

  6. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  7. hdu 5147 Sequence II (树状数组 求逆序数)

    题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. poj 2299 Ultra-QuickSort(树状数组求逆序数)

    链接:http://poj.org/problem?id=2299 题意:给出n个数,求将这n个数从小到大排序,求使用快排的需要交换的次数. 分析:由快排的性质很容易发现,只需要求每个数的逆序数累加起 ...

  9. SGU180 Inversions(树状数组求逆序数)

    题目: 思路:先离散化数据然后树状数组搞一下求逆序数. 离散化的方法:https://blog.csdn.net/gokou_ruri/article/details/7723378 自己对用树状数组 ...

随机推荐

  1. 深入理解java:4.2. 框架编程之Spring框架的设计理念

    什么是Spring呢? Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. Spring优点 简单了解Spring之后,我们看一下Spri ...

  2. selenium—用NoSuchElementException异常判断页面元素是否存在

    一.知识补充 1.find_element的一种使用方法: find_element(by=方法,value=值) 例如: find_element(by="id",value=& ...

  3. swagger生成文档初步使用

    在大部分情况下,公司都会要求提供详细的接口文档,对于开发来说,文档有时候在赶进度的情况下,也是一件头疼的事.而swagger的自动生成文档功能,就可以帮助我们减少工作量,对于文档的修改也可以在代码中随 ...

  4. TP5报错Fatal error: require(): Failed opening required '/home/www/xx/public/../thinkphp/start.php

    https://jingyan.baidu.com/article/afd8f4deb784fe34e386e97b.html https://www.cnblogs.com/300js/p/9224 ...

  5. shiro三连斩之概念

    1, 什么是Shiro? Shiro是一个安全框架,用于解决系统的认证和授权问题,同时提供了会话管理,数据加密,与WEB集成,缓存等机制. Authentication:身份认证/登录,验证用户是不是 ...

  6. 如何创建并发布一个 vue 组件

    步骤 创建 vue 的脚手架 npm install -g @vue/cli vue init webpack 绑定 git 项目 cd existing_folder git init git re ...

  7. 解决:centos配置ssh免密码登录后仍要输入密码

    转自https://www.jb51.net/article/121180.htm 第一步:在本机中创建秘钥 1.执行命令:ssh-keygen -t rsa 2.之后一路回车就行啦:会在-(home ...

  8. java中常见的异常种类

    Java常见的异常种类 ------------------------------------------------------------------------------- java Exc ...

  9. 程序员称为高手的10条心得(摘自http://www.jizhuomi.com/software/394.html)

    在这个世界上,有数百万的人热衷于软件开发,他们有很多名字,如:软件工程师(Software Engineer),程序员(Programmer),编码人(Coder),开发人员(Developer).经 ...

  10. zencart批量表上传后 标题显示为网址 批量修改标题状态 SEO三要素

    zencart批量表上传后 标题显示为网址,原因是导入批量表时,产品标题对应状态被重置为0导致的 批量修改标题状态 ', metatags_products_name_status ', metata ...