题目链接:点击查看

题目大意:线段树求逆序数,给出的数列可以组成环,问怎么样求可以让逆序数最小,输出最小值

题目分析:看到这个题的第一反应是暴力枚举5000种情况,因为感觉这个题的N给的不是很大,但是仔细一想应该是个N*N*logN的时间复杂度,一下子到了1e8,肯定是稳稳的T了,就没去尝试,这个题目最关键的点是找到逆序数的关系,做过这么多有关逆序数的题目,都是变形题目,但是本质是不变的,我们可以这样分析,每次给出的数都是0~n-1,则设第i个数为a[i],那么在n个数中,除去它本身还有n-1个数,比它本身小的有a[i]-1个数,比它本身大的有n-1-(a[i]-1)个数,那么我们如果将第一个数移动到了最后一位,我们可以分步来考虑:

  1. 先将第一个数删除,那么在它后面有a[i]-1个数比它小,即新数列的逆序数会减少a[i]-1
  2. 再将刚刚被删除的数加在最后一位,则它的前面现在有了n-1-(a[i]-1)个数比它大,即新数列的逆序数会增加n-1-(a[i]-1)

综上所述,每一次数列所组成的环转动一个单位,逆序数就会在之前的基础上增加n-1-(a[i]-1)-(a[i]-1),化简得到n-2*a[i]+1

注意:有个细节就是它给出的数列是0~n-1,我们可以给每一项都加1来完成我们上述的结论,加上我这个题偷懒用树状数组写的,所以只能从1开始,具体的会在注释中说明,上代码:

 #include<iostream>#include<cstdio> #include<string>#include<cstring>#include<algorithm>#include<stack>#include<queue>#include<map>#include<sstream>#include<cmath>using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=5050;int n;int c[N],a[N];int lowbit(int x){return x&-x;}void update(int pos){while(pos<=n){c[pos]++;pos+=lowbit(pos);}}int query(int pos){int ans=0;while(pos){ans+=c[pos];pos-=lowbit(pos);}return ans;}int main(){//    freopen("input.txt","r",stdin);while(scanf("%d",&n)!=EOF){memset(c,0,sizeof(c));for(int i=1;i<=n;i++){scanf("%d",a+i);a[i]++;//因为数列是从0开始,所以统一向右偏移一个单位,保证所有的数都为正数}int ans=0;for(int i=1;i<=n;i++){ans+=query(n)-query(a[i]);update(a[i]);} int mmin=ans;for(int i=1;i<=n;i++){ans=ans+n-2*a[i]+1;mmin=min(mmin,ans);}cout<<mmin<<endl;}return 0;}

HDU - 1394 Minimum Inversion Number(树状数组)相关推荐

  1. HDU 1394 Minimum Inversion Number(线段树的单点更新)

    点我看题目 题意 :给你一个数列,a1,a2,a3,a4.......an,然后可以求出逆序数,再把a1放到an后,可以得到一个新的逆序数,再把a2放到a1后边,,,,,,,依次下去,输出最小的那个逆 ...

  2. 逆序数2 HDOJ 1394 Minimum Inversion Number

    题目传送门 1 /* 2 求逆序数的四种方法 3 */ 1 /* 2 1. O(n^2) 暴力+递推 法:如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]. ...

  3. HDU 5517---Triple(二维树状数组)

    题目链接 Problem Description Given the finite multi-set A of n pairs of integers, an another finite mult ...

  4. POJ 3928 hdu 2492 Uva1428 PingPong 【树状数组】

    Ping pong                                                   Time Limit: 2000/1000 MS (Java/Others)   ...

  5. HDU 3584 Cube (三维树状数组)

    Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the nu ...

  6. hdu 5157(manacher+前缀和+树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5157 解题思路: 我们可以先用mancher算法对字符串进行处理,把以每个点为中心的回文串半径求出来, ...

  7. hdu 6447YJJ's Salesman 离散化+树状数组+DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 因为图中点的坐标值过大,达到1e9.然而只有1e5个点.所以先将其离散化.并按照<x.y& ...

  8. [HDU - 2852] KiKi's K-Number (树状数组+二分)

    链接 http://acm.hdu.edu.cn/showproblem.php?pid=2852 题意 现在需要你对一个空序列做nnn次操作,操作分三种 0x0\ \ x0  x :向序列中加入一个 ...

  9. HDU - 5775 - Bubble Sort( 树状数组 + 思维 )

    题目链接:点击进入 题目 题意 问在给出的冒泡排序过程中,一个数到达的最右边位置与最左边位置距离差. 思路 对于一个数,位置 i ,假设右边比它小的数有 r 个,左边比它大的数有 l 个,最右边到达的 ...

最新文章

  1. 三极管的发射极与集电极之间的关系
  2. python中filter函数的使用
  3. Office365 用户同步排错思路
  4. JavaScript常见面试题和答案
  5. Examine INIT services -- Linux
  6. 刘强东卸任京东 CEO,“二号位”徐雷接棒:三大电商巨头“二把手”正式集齐
  7. Git 基本分支规范
  8. python绘制小猪佩奇
  9. mysql中kill掉所有锁表的进程
  10. 符合c语言语法规定的是,若变量已正确定义并赋值,符合C语言语法的表达式是 A。a=a+7; B.a=7+b+c,a++...
  11. [笔记分享] [Camera] msm8926的ZSL功能小结
  12. php轻松入门视频教程,PHP轻松入门视频教程
  13. android apk 微信登入_图文详解Android集成微信登录的步骤
  14. 微信小程序卡包wx.addcard文档缺失-ext参数说明
  15. 5、Cloudsim基础类
  16. 微博应用 php源码,新版微测试应用平台|微博应用|微趣源码,有后台+2套模版
  17. 修改centos网口名称
  18. Urban Airship Android Client - Helium Push
  19. 【Oracle EBS】解决大数据量Excel报表打开缓慢问题
  20. linux下qt编程小游戏,Demo_2:Qt实现猜字小游戏

热门文章

  1. spring Aop的概念
  2. 用户认证-什么是认证
  3. Spring 的创建流程
  4. 使用JWT进行跨域身份验证
  5. 转发和重定向和request域对象
  6. 给zuul网关添加过滤器
  7. Spring Boot整合@Cacheable注解使用
  8. 元组-元组变量的常用操作
  9. plsql(轻量版)_基本语法
  10. python操作php文件,python怎么操作文件