HDU 1394 Minimum Inversion Number (树状数组求逆序对)
2016-04-04 13:50
447 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394
题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多少。
一开始就求原来初始数组的逆序对,树状数组求或者归并方法求(可以看《挑战程序设计》P178),然后根据最前面的元素大小递推一下每次移到最后得到的逆序数,取最小值。
题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多少。
一开始就求原来初始数组的逆序对,树状数组求或者归并方法求(可以看《挑战程序设计》P178),然后根据最前面的元素大小递推一下每次移到最后得到的逆序数,取最小值。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 5005; int bit[MAXN] , n , a[MAXN]; inline void add(int i , int num) { for( ; i <= n ; i += (i & -i)) bit[i] += num; } int sum(int i) { int res = 0; for( ; i > 0 ; i -= (i & -i)) res += bit[i]; return res; } int main() { while(~scanf("%d" , &n)) { memset(bit , 0 , sizeof(bit)); int res = 0 , ans; for(int i = 0 ; i < n ; i++) { scanf("%d" , a + i); a[i]++; res += i - sum(a[i]); add(a[i] , 1); } ans = res; for(int i = 0 ; i < n - 1 ; i++) { ans -= (a[i] - 1); ans += (n - a[i]); res = min(res , ans); } printf("%d\n" , res); } }
相关文章推荐
- C/C++—— 在构造函数中调用虚函数能实现多态吗(Vptr指针初始化的过程分析)
- ThreadLocal管理下的Session
- Android中layout_gravity和gravity的区别
- 计算机基础(1)-原码、反码、补码
- AB压力测试工具
- lintcode-medium-Permutations
- Ubuntu下图形界面SVN客户端-RabbitVCS的安装
- poj 3084 最小割
- AndroidEventBus源码分析
- CentOS7从ELRepo源中安装Nvidia显卡驱动
- Android Gradle Plugin指南(二)——基本项目
- 学习笔记 第六周 第二篇
- java虚拟机学习之内存管理
- NYOJ 12 喷水装置(二)
- JDK7 提供了 7 个阻塞队列
- Android开发环境搭建
- wav文件格式分析详解
- SimpleDateFormat 的 format 方法使用具体解释
- LAMP平台部署及应用
- android TextView里边实现图文混配效果