题目

按顺序给出N个数字,求出所有的逆序对个数(逆序对指数字 Ai > Aj且 i < j) 
题目链接:hiho_1141 
    数据规模为 100000,必须使用O(nlogn)的算法来进行求解。下标i从0到N-1,依次求出数字Ai,在A[0, i-1]中比Ai大的数字个数K,将所有的K进行加和即可得到结果。 
    这种动态的排序+统计,使用treap。

实现

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<iostream>
  4. #include<string>
  5. #include<set>
  6. #include<map>
  7. #include<vector>
  8. #include<queue>
  9. #include<stack>
  10. #include<unordered_map>
  11. #include<unordered_set>
  12. #include<algorithm>
  13. using namespace std;
  14. struct Node{
  15. int val;
  16. int priority;
  17. int count;
  18. int sum;
  19. Node* childs[2];
  20. Node(int v = 0) :val(v){
  21. priority = rand();
  22. childs[0] = childs[1] = NULL;
  23. count = sum = 1;
  24. }
  25. void Update(){
  26. sum = count;
  27. if (childs[0])
  28. sum += childs[0]->sum;
  29. if (childs[1])
  30. sum += childs[1]->sum;
  31. }
  32. };
  33. struct Treap{
  34. Node* root;
  35. Treap(){
  36. root = NULL;
  37. }
  38. void Rotate(Node*& node, bool dir){
  39. Node* ch = node->childs[dir];
  40. node->childs[dir] = ch->childs[!dir];
  41. ch->childs[!dir] = node;
  42. node->Update();
  43. node = ch;
  44. }
  45. void Insert(Node*& node, int val){
  46. if (!node){
  47. node = new Node(val);
  48. return;
  49. }
  50. if (node->val == val){
  51. node->count++;
  52. node->sum++;
  53. return;
  54. }
  55. else{
  56. bool dir = node->val < val;
  57. Insert(node->childs[dir], val);
  58. if (node->childs[dir]->priority > node->priority){
  59. Rotate(node, dir);
  60. }
  61. node->Update();
  62. }
  63. }
  64. int Search(Node* node, int val){
  65. if (!node)
  66. return 0;
  67. if (node->val == val){
  68. if (node->childs[1])
  69. return node->childs[1]->sum;
  70. else
  71. return 0;
  72. }
  73. else if (node->val > val){
  74. return Search(node->childs[0], val) + (node->childs[1]? node->childs[1]->sum + node->count : node->count);
  75. }
  76. else
  77. return Search(node->childs[1], val);
  78. }
  79. };
  80. int main(){
  81. Treap treap;
  82. int N;
  83. scanf("%d", &N);
  84. long long int count = 0;
  85. int val;
  86. for (int i = 0; i < N; i++){
  87. scanf("%d", &val);
  88. count += (treap.Search(treap.root, val));
  89. treap.Insert(treap.root, val);
  90. }
  91. printf("%lld\n", count);
  92. return 0;
  93. }

hiho_1141的更多相关文章

随机推荐

  1. C#异步编程简单的运用

    当一个方法中有很多复杂的操作的时候就可以使用异步编程. 假如说这一个方法中有很多复杂的操作,把每一个复杂的操作放到一个异步方法中. 原来程序需要这些方法,上一个执行完成之后,才能执行下一个操作. 但是 ...

  2. 利用AdaBoost元算法提高分类性能

    当做重要决定时,大家可能都会吸取多个专家而不只是一个人的意见.机器学习处理问题时又何尝不是如此?这就是元算法背后的思路.元算法是对其他算法进行组合的一种方式. 自举汇聚法(bootstrap aggr ...

  3. 移动表格行 解决低版本IE fadeIn fadeOut 失效问题

    在维护一个内部使用的web工具的时候,需要在表格里配置参数,并且支持参数列的上下移动,有jQuery-UI工具支持对表格列的拖动,但是此处不追求效果,而且旧系统页面兼容性很差,无奈只能做上下移动的按钮 ...

  4. Intelligencia.UrlRewriter在IIS 7.0下的完全配置攻略

    在项目中,之前公司是使用IIS 7.0官方的URL重写模块,官方的使用说明请参见官方URLRewrite  ,添加伪静态支持,后来经理问我有没有涉及伪静态,我说之前项目中我一直是用Intelligen ...

  5. java math library

    https://github.com/jroyalty/jglm https://github.com/JOML-CI/JOML

  6. windows服务的创建、安装、调试全过程及引发的后续学习

    前几天做项目的时候需要用到window服务,研究一段时间,算是掌握了最基本的使用方法吧,现总结如下: 引言:在项目过程中碰到一个问题:需要不断的扫描一个大型数据库表,并获取dataset,以便做后续的 ...

  7. 【转】数据库系统异常排查之DMV

    数据库系统异常是DBA经常要面临的情景,一名有一定从业经验的DBA,都会有自己一套故障排查的方法和步骤,此文为为大家介绍一下通过系统 性能视图(SQLServer05以上版本)来排查系统异常的基本方法 ...

  8. 安装vim

    命令安装vim sudo apt-get install vim

  9. 【selenium 3】 Mac 下测试环境搭建 Firefox 47+ gecko driver Mac

    错误代码如下:File "/usr/local/lib/python2.7/dist-packages/selenium-3.0.0b2-py2.7.egg/selenium/webdriv ...

  10. 利用jquery获取html中被选中的input的值

    单个按钮 <div id="wrap"> <input type="radio" name="payMethod" val ...