http://acm.hdu.edu.cn/showproblem.php?pid=1394

很基础的线段树.

先查询在更新,如果后面的数比前面的数小肯定会查询到前面已经更新过的值,这时候返回的sum就是当前数的逆序数.

这样查询完之后得到初始数列的逆序数,要求得所有序列的最小逆序数,还需要循环一次.

设初始序列abcde中逆序数为k,小于a的个数是t-1那么大于a的个数就是n-t,当把a左移一位,原来比a大的都变成了a的逆序对,即逆序数增加了n-t,但是原来比a小的数都变成了顺序,

因此逆序数减少了t-1,所以新的序列的逆序数为k+=n-t-t+1;

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstring>
  6. #include <string>
  7. #include <algorithm>
  8. #include <string>
  9. #include <set>
  10. #include <functional>
  11. #include <numeric>
  12. #include <sstream>
  13. #include <stack>
  14. #include <map>
  15. #include <queue>
  16. #include <deque>
  17. //#pragma comment(linker, "/STACK:102400000,102400000")
  18. #define CL(arr, val) memset(arr, val, sizeof(arr))
  19.  
  20. #define ll long long
  21. #define INF 0x7f7f7f7f
  22. #define lc l,m,rt<<1
  23. #define rc m + 1,r,rt<<1|1
  24. #define pi acos(-1.0)
  25.  
  26. #define L(x) (x) << 1
  27. #define R(x) (x) << 1 | 1
  28. #define MID(l, r) (l + r) >> 1
  29. #define Min(x, y) (x) < (y) ? (x) : (y)
  30. #define Max(x, y) (x) < (y) ? (y) : (x)
  31. #define E(x) (1 << (x))
  32. #define iabs(x) (x) < 0 ? -(x) : (x)
  33. #define OUT(x) printf("%I64d\n", x)
  34. #define lowbit(x) (x)&(-x)
  35. #define Read() freopen("a.txt", "r", stdin)
  36. #define Write() freopen("b.txt", "w", stdout);
  37. #define maxn 5010
  38. #define maxv 50010
  39. #define mod 1000000000
  40. using namespace std;
  41. #define lson l,m,rt<<1
  42. #define rson m+1,r,rt<<1|1
  43.  
  44. int sum[maxn<<];
  45.  
  46. void PushUP(int rt)
  47. {
  48. sum[rt]=sum[rt<<]+sum[rt<<|];
  49. }
  50.  
  51. void build(int l,int r,int rt)
  52. {
  53. sum[rt]=;
  54. if(l==r) return;
  55. int m=(l+r)>>;
  56. build(lson);
  57. build(rson);
  58. }
  59.  
  60. void update(int p,int l,int r,int rt)
  61. {
  62. if(l==r)
  63. {
  64. sum[rt]++;
  65. return;
  66. }
  67. int m=(l+r)>>;
  68. if(p<=m) update(p,lson);
  69. else update(p,rson);
  70. PushUP(rt);
  71. }
  72.  
  73. int query(int L,int R,int l,int r,int rt)
  74. {
  75. if(L<=l&&r<=R)
  76. {
  77. return sum[rt];
  78. }
  79. int m=(l+r)>>;
  80. int ret=;
  81. if(L<=m) ret+=query(L,R,lson);
  82. if(R>m) ret+=query(L,R,rson);
  83. return ret;
  84. }
  85.  
  86. int x[maxn];
  87. int main()
  88. {
  89. //Read();
  90. int n;
  91. while(~scanf("%d",&n))
  92. {
  93. build(,n-,);
  94. int ans=;
  95. for(int i=;i<n;i++)
  96. {
  97. scanf("%d",&x[i]);
  98. ans+=query(x[i],n-,,n-,);
  99. update(x[i],,n-,);
  100. }
  101. int ret=ans;
  102. for(int i=;i<n;i++)
  103. {
  104. ans+=n-x[i]-x[i]-;
  105. ret=min(ret,ans);
  106. }
  107. printf("%d\n",ret);
  108. }
  109. return ;
  110. }

hdu - 1394 Minimum Inversion Number(线段树水题)的更多相关文章

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

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

  2. [HDU] 1394 Minimum Inversion Number [线段树求逆序数]

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

  3. HDU 1394 Minimum Inversion Number(线段树 或 树状数组)

    题目大意:给出从 0 到 n-1 的整数序列,A0,A1,A2...An-1.可将该序列的前m( 0 <= m < n )个数移到后面去,组成其他的序列,例如当 m=2 时,得到序列 A2 ...

  4. HDU 1394 Minimum Inversion Number 线段树

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=1394 没看到多组输入,WA了一万次...... 其实很简单,有人暴力过得,我感觉归并排序.二叉排序树求逆 ...

  5. HDU 1394 Minimum Inversion Number (树状数组)

    题目链接 Problem Description The inversion number of a given number sequence a1, a2, ..., an is the numb ...

  6. hdu 1394 Minimum Inversion Number (树状数组求逆序对)

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

  7. HDU 1394 Minimum Inversion Number(树状数组/归并排序实现

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

  8. hdu 1394 Minimum Inversion Number(树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个0 — n-1的排列,对于这个排列你可以将第一个元素放到最后一个,问你可能得到的最 ...

  9. hdu 13394 Minimum Inversion Number 线段树

    题意: 首先给你一个长度为n的序列v,你需要首先找出来逆序对(i<j && v[i]>v[j]) 然后把这个序列的最后一个元素放在第一个位置上,其他元素都向后移动一位. 一 ...

随机推荐

  1. Html标签杂记

    <html> <head> <title> </title> </head> <body> </body> < ...

  2. Unity笔记(4)自学第四、五天

    主要是移动脚本和2个技能的脚本编写. 首先是移动的脚本: using System.Collections; using System.Collections.Generic; using Unity ...

  3. Android学习笔记(十三) Handler

    可用于解决上一则笔记所提到的WorkerThread无法修改UI控件的问题 一.Handler.Looper和MessageQueue的基本原理 Handler把消息对象放到MessageQueue当 ...

  4. R in action读书笔记(2)-第五章:高级数据管理(下)

    5.4 控制流  语句(statement)是一条单独的R语句或一组复合语句(包含在花括号{ } 中的一组R语 句,使用分号分隔):  条件(cond)是一条最终被解析为真(TRUE)或假(FAL ...

  5. Farseer.net轻量级开源框架说明及链接索引

    Farseer.net是什么? 基于.net framework 4 开发的一系列解决方案. 完全开源在GitHub中托管.并发布到NuGet中. Farseer.Net由最初的关系数据库ORM框架后 ...

  6. ubuntu命令行使用ftp客户端

    转载 本篇文章主要介绍在Ubuntu 8.10下如何使用功能强大的FTP客户端软件NcFTP. Ubuntu的源里为我们提供了FTP客户端软件NcFTP,可这款工具对新手来说不是很方便.本文介绍的是一 ...

  7. 洛谷 P2341 [HAOI2006]受欢迎的牛

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C ...

  8. windows测试物理网络

    ping 192.168.10.88 -t ,参数-t是等待用户去中断测试 

  9. vue脚手架引入swiper

    方法一: 下载swiper: npm install swiper --save-dev swiper4.0使用入口:http://www.swiper.com.cn/usage/index.html ...

  10. org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException 前言中不允许有内容 来自类路径资源的XML文档中的第1行是无效的

    今天复习一下Spring和Hibernate的整合,遇到了一个问题,报错信息如下: org.springframework.beans.factory.xml.XmlBeanDefinitionSto ...