出处:http://blog.csdn.net/enjoying_science/article/details/44114035

(有难度,以后回来填坑)

阅读代码中:

  1. #include<stdio.h>
  2. #include<iostream>
  3. using namespace std;
  4. #define ForD(i,n) for(int i=n;i;i--)
  5. #define F (100000007)
  6. #define MAXN (2*200000+10)
  7. long long mul(long long a,long long b){return (a*b)%F;}
  8. long long add(long long a,long long b){return (a+b)%F;}
  9. long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
  10.  
  11. int n,root=;/*n->叶子结点数,root->根序号?*/
  12. struct node
  13. {
  14. int fa; /*父结点的下标*/
  15. int ch[]; /*0->左树下标 1->右树下标*/
  16. int size; /*size->当前结点含有的有效结点数*/
  17. int c; /*当前结点的数值*/
  18. node():size(),c(){ch[]=ch[]=fa=;} /*初始化为0*/
  19. }a[MAXN]; /*树形数组->纪录各叶结点的数值*/
  20.  
  21. void update(int x)/*更新叶结点个数*/
  22. {
  23. a[x].size=a[a[x].ch[]].size+a[a[x].ch[]].size+(a[x].c>);
  24. }
  25. int tail=;
  26. void pushdown(int x)/*将叶结点的父结点指向当前结点*/
  27. {
  28. a[a[x].ch[]].fa=a[a[x].ch[]].fa=x;
  29. }
  30.  
  31. /*创建树*/
  32. void build(int &x)
  33. {
  34. if (!x) x=++tail;
  35. scanf("%d",&a[x].c);
  36. if (a[x].c==)
  37. {
  38. build(a[x].ch[]);/*创建左子树*/
  39. build(a[x].ch[]);/*创建右子树*/
  40. update(x);pushdown(x);/*更新当前结点的有效叶结点个数,以及父结点指向*/
  41. }else a[x].size=;
  42. }
  43.  
  44. void rotate(int x)/*旋转*/
  45. {
  46. int y=a[x].fa,z=a[y].fa;
  47. bool p=a[y].ch[]==x;
  48. if (z) /*有爷爷*/
  49. {
  50. if (a[z].ch[]==y) /*未旋转*/
  51. a[z].ch[]=x;/*将子树提拔为父树(升序)*/
  52. else
  53. a[z].ch[]=x; /*还原状态*/
  54. }
  55. a[x].fa=z,a[y].fa=x;/*当前结点与父结点交换(父结点指向)*/
  56. if (a[x].ch[p]) /*原子树是否有右树(隔代转移)*/
  57. a[a[x].ch[p]].fa=y;
  58. a[y].ch[p^]=a[x].ch[p];
  59. a[x].ch[p]=y; /*父树移至子树的右端(右树)*/
  60. update(y); /*更新旋转后,子树的结点的有效结点数*/
  61. }
  62.  
  63. void splay(int x)
  64. {
  65. while (a[x].fa)/*不为根结点*/
  66. {
  67. int y=a[x].fa,z=a[y].fa;
  68. if (z) /*有爷爷*/
  69. if ((a[y].ch[]==x)^(a[z].ch[]==y)) rotate(x);/*旋转*/
  70. else rotate(y);
  71. rotate(x);
  72. }
  73. update(x);
  74. }
  75. void ins(long long &tot,int x,int y)
  76. {
  77. a[x].size++; /*插入+1*/
  78. if (a[y].c<=a[x].c) /*是逆序对*/
  79. {
  80. if (a[x].ch[]) /*左树有子*/
  81. ins(tot,a[x].ch[],y);
  82. else /*左树无子*/
  83. a[y].fa=x,splay(a[x].ch[]=y);/*右数插入到左树子*/
  84. }
  85. else
  86. {
  87. tot+=a[a[x].ch[]].size+(a[x].c>);
  88. if (a[x].ch[]) ins(tot,a[x].ch[],y);
  89. else a[y].fa=x,splay(a[x].ch[]=y);
  90. }
  91. }
  92.  
  93. int q[MAXN],size;
  94.  
  95. void clac(int x,int y)
  96. {
  97. if (a[y].ch[]) clac(x,a[y].ch[]);
  98. if (a[y].c) q[++size]=y;
  99. if (a[y].ch[]) clac(x,a[y].ch[]);
  100. }
  101.  
  102. long long merge(bool &lor,int z)/*分治*/
  103. {
  104. int x=a[z].ch[],y=a[z].ch[];
  105. if (a[x].size<a[y].size) /*判断叶结点多的往前调(平衡树?)*/
  106. swap(x,y);
  107.  
  108. a[x].fa=;a[y].fa=;q[]=y;
  109. size=;clac(x,y);
  110. long long tot=; /*最少逆序对*/
  111. ForD(i,size) /*循环(子结点数)次*/
  112. {
  113. int now=q[i];
  114. a[now].ch[]=a[now].ch[]=a[now].fa=;
  115. a[now].size=;
  116. ins(tot,x,now);
  117. x=now;
  118. }
  119. a[x].fa=z;
  120. a[z].ch[]=,a[z].ch[]=x;
  121. return tot;
  122. }
  123.  
  124. long long qur(int &x)
  125. {
  126. if (a[x].c) return ;/*若根结点没有叶结点,则逆序对为0*/
  127. else
  128. {
  129. long long lson=a[a[x].ch[]].size,rson=a[a[x].ch[]].size,ls=qur(a[x].ch[]),rs=qur(a[x].ch[]);
  130. bool lor=;
  131. long long ms=merge(lor,x);
  132. return ls+rs+min(lson*rson-ms,ms);
  133. }
  134. }
  135. int main()
  136. {
  137. scanf("%d",&n);
  138. build(root);
  139. cout<<qur(root)<<endl;
  140. return ;
  141. }

ALGO-7_蓝桥杯_算法训练_逆序对的更多相关文章

  1. Java实现蓝桥杯VIP算法训练 数组逆序排列

    试题 算法训练 数组逆序排列 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束. ...

  2. [蓝桥杯]ALGO-20.算法训练_求先序排列

    问题描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=). 输入格式 两行,每行一个字符串,分别表示中序和后序排列 输出格式 一个字符串,表示所求 ...

  3. [蓝桥杯]ALGO-16.算法训练_进制转换

    问题描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*102+2*101+3*100这样 ...

  4. [蓝桥杯]ALGO-15.算法训练_旅行家的预算

    问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  5. [蓝桥杯]ALGO-124.算法训练_数字三角形

    问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●<三角形行数≤: ●三角 ...

  6. [蓝桥杯]ALGO-122.算法训练_未名湖边的烦恼

    问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个.现在 ...

  7. [蓝桥杯]ALGO-116.算法训练_最大的算式

    问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号 ...

  8. [蓝桥杯]ALGO-101.算法训练_图形显示

    问题描述 编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数): * * * * * * * * * * * * * * * 题目描述 代码如下: #include < ...

  9. [蓝桥杯]ALGO-97.算法训练_排序

    题目描述: 问题描述 编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列. 输入格式:输入只有一行,即三个整数,中间用空格隔开. 输出格式:输出只有一行,即排序后的结果. 输入输出 ...

  10. [蓝桥杯]ALGO-92.算法训练_前缀表达式

    问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值.输入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法).“-”(减法).“*”(乘法)或“/”(除法),运算对象为 ...

随机推荐

  1. springboot2.0 web 开发标准目录架构

    ├── clean-run.sh ├── logs/ 日志文件目录 │ ├── sb2-web_test_2018-06-02_0959.0.log │ └── sb2-web_test.log | ...

  2. 重置delphi Printer对象

    http://www.efg2.com/Lab/Library/UseNet/1999/0714b.txt From: "Nick Ryan" <nick@avatardes ...

  3. vue + element-ui Table的数据多选,多页选择数据回显,分页记录保存选中的数据。

    业务的需要:我要对与会人员勾选,记录所选的与会人员,并且点击到别的页面上时也要记录所勾选的.第一次尝试,每次点击下一页数据都会清空.然后我就去element ui官网查看了api.实现如下: 在tab ...

  4. Latex的\cite后面的参考文献显示问号

    今天编写Latex的参考文献,发现编译之后参考文献都是问号,很疑惑.网上搜到一个帖子,发现他的问题和我的类似,但他比我还多出一个问题,就是Bibtex按钮是灰色的无法使用. 遇到“看不到Bibtex按 ...

  5. 关于LUN和卷的思考

    LUN:logical unit number 是指硬件层分出的逻辑盘,OS仍然把这些逻辑盘看成是物理盘. 例如将一个1PB磁盘柜划分为100个相同大小的lun,那么每个lun的大小就是10TB,lu ...

  6. pdo::quey excu excute 区别

    PDO::query(PHP环境下同)和PDOStatement::execute函数均能实现SELECT查询功能,但官方文档并未见对此设计初衷的说明,此外还有个PDO::exec函数功能也很类似.天 ...

  7. null与undefined

    null是一个表示"无"的对象,转为数值时为0:undefined是一个表示"无"的原始值,转为数值时为NaN. undefined和null在if语句中,都会 ...

  8. [leetcode] 94. Binary Tree Inorder Traversal 二叉树的中序遍历

    题目大意 https://leetcode.com/problems/binary-tree-inorder-traversal/description/ 94. Binary Tree Inorde ...

  9. xgboost 简单测试

    #coding=utf8 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.f ...

  10. HDU 4666 最远曼哈顿距离

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4666 关于最远曼哈顿距离的介绍: http://blog.csdn.net/taozifish/ar ...