【题目大意】

给出0..n-1组成的一段数,可以移动前几个数到结尾。求出最小的逆序对个数。

【思路】

先用线段树求出逆序对,方法和树状数组是一样的。然后对于当前第一个数num[0],在它之后比它小的数有num[0],则它移动到末位之后减小的逆序对是num[0],增加的是n-1-num[0]。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. #define lson l,m,root<<1
  8. #define rson m+1,r,root<<1|1
  9. const int MAXN=+;
  10. int n,num[MAXN];
  11. int sum[MAXN*];
  12. int inver[MAXN];
  13.  
  14. void pushUP(int root)
  15. {
  16. sum[root]=sum[root<<]+sum[root<<|];
  17. }
  18.  
  19. void build(int l,int r,int root)
  20. {
  21. if (l==r)
  22. {
  23. sum[root]=;
  24. return;
  25. }
  26. int m=(l+r)>>;
  27. build(lson);
  28. build(rson);
  29. pushUP(root);
  30. }
  31.  
  32. void update(int p,int delta,int l,int r,int root)
  33. {
  34. if (l==r)
  35. {
  36. sum[root]+=delta;
  37. return;
  38. }
  39. int m=(l+r)>>;
  40. if (p<=m) update(p,delta,lson);
  41. if (p>m) update(p,delta,rson);
  42. pushUP(root);
  43. }
  44.  
  45. int query(int L,int R,int l,int r,int root)
  46. {
  47. if (L<=l && r<=R)
  48. {
  49. return sum[root];
  50. }
  51. int m=(l+r)>>,res=;
  52. if (L<=m) res+=query(L,R,lson);
  53. if (R>m) res+=query(L,R,rson);
  54. return res;
  55.  
  56. }
  57.  
  58. int main()
  59. {
  60. while (scanf("%d",&n)!=EOF)
  61. {
  62. build(,n-,);
  63. for (int i=;i<n;i++)
  64. {
  65. scanf("%d",&num[i]);
  66. inver[i]=query(num[i]+,n,,n,);
  67. update(num[i]+,,,n,);
  68. }
  69. int tempsum=;
  70. for (int i=;i<n;i++) tempsum+=inver[i];
  71. int ans=tempsum;
  72. for (int i=;i<n;i++)
  73. {
  74. tempsum-=num[i];
  75. tempsum+=n--num[i];
  76. ans=min(ans,tempsum);
  77. }
  78. cout<<ans<<endl;
  79. }
  80. return ;
  81. }

【线段树】HDU1394 - Minimum Inversion Number的更多相关文章

  1. hdu1394(Minimum Inversion Number)线段树

    明知道是线段树,却写不出来,搞了半天,戳,没办法,最后还是得去看题解(有待于提高啊啊),想做道题还是难啊. 还是先贴题吧 HDU-1394 Minimum Inversion Number Time ...

  2. HDU-1394 Minimum Inversion Number 线段树+逆序对

    仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...

  3. HDU1394 Minimum Inversion Number(线段树OR归并排序)

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

  4. 2018.07.08 hdu1394 Minimum Inversion Number(线段树)

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

  5. HDU-1394 Minimum Inversion Number (逆序数,线段树或树状数组)

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

  6. HDU-1394 Minimum Inversion Number(线段树求逆序数)

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

  7. hdu1394 Minimum Inversion Number (线段树求逆序数&&思维)

    题目传送门 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

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

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

  9. hdu1394 Minimum Inversion Number(最小逆序数)

    Minimum Inversion Number Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/O ...

随机推荐

  1. linux编程之消息队列

    消息队列是内核地址空间中的内部链表,通过linux内核在各个进程之间传递内容,消息顺序地发送到消息队列中,并且以几种不同的方式 从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识,内核中的消息 ...

  2. 【设计模式】迭代器模式(Iterator )

    摘要: 1.本文将详细介绍迭代器模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入迭代器模式 2. 迭代器的概念及优缺点介绍 3. 迭代器在Android源码中的应用 1 ...

  3. Microsoft Security Essential: 微软安全软件

    Microsoft Security Essential: 微软安全软件 这个杀毒软件终身免费

  4. hit-testing机制介绍

    1.简介 寻找处理触摸事件的view的过程为hit-testing,找到的能够处理触摸事件的view叫做hit-test view. 2.机制介绍 假设下图为我们的手机屏幕,当我们假设点击了view ...

  5. ubuntu 10.04打开错误

    打开ubuntu时,出现的错误如下: Invalid configuration file. File "E:\Ubuntu12.04.vmwarevm\Ubuntu12.04.vmx&qu ...

  6. debian下没有公钥解决办法

    debian下没有公钥解决办法   执行命令:apt-get update  出现如下错误   正在读取软件包列表... 完成   W: 以下 ID 的密钥没有可用的公钥: 8B48AD6246925 ...

  7. java的装饰设计模式

    类似python中的装饰器. 示例: public class Test5 { public static void main(String[] args) { Worker w = new Work ...

  8. 《java并发编程实战》读书笔记2--对象的共享,可见性,安全发布,线程封闭,不变性

    这章的主要内容是:如何共享和发布对象,从而使它们能够安全地由多个线程同时访问. 内存的可见性 确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化. 上面的程序中NoVisibility可能 ...

  9. Go语言入门之变量声明

    1.使用var关键字声明变量,如果没有初始化,则变量默认为零值. var a string "hello world" 2.根据值自行判定变量类型 3.多变量声明 ,, 4.使用v ...

  10. docker容器中文件的上传与下载

    原文地址:传送门 1.上传文件 docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH [OPTIONS]:保持源目标中的链接,例: docker cp ...