交换两个数,求使得排列的逆序数最多减少多少,以及有多少个这样的数对

数据范围有5000,我的算法是n^2logn

因为有n^2个询问,所以最好O(1)的回答,所以需要先预处理一下。

怎样快速回答交换两个数之后逆序数的改变呢?

这就要快速的算出i和j之间有多少个比num[i]小的数,有多少个比num[j]小的数,比它们大的数一减就OK。

设 si为i到j中比i小的数 bi为比i大的数 sj为比j小的数,bj为比j大的数。

所以逆序数减少量为旧逆序数-新逆序数=si-bi+bj-sj-1 最后那个1是指i和j交换后减少的逆序数。

#include<stdio.h>
#include<string.h>int res[5200][5200];//到i为止小于num[j]的数字
int bit[5200],n;
int num[5200];int sum(int i)
{int s=0;while(i>0){s+=bit[i];i -= i & -i;}return s;
}void add(int i,int x)
{while(i<=n){bit[i]+=x;i += i & -i;}
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&num[i]);num[i]++;}memset(bit,0,sizeof(bit));memset(res,0,sizeof(res));int tot=0;for(int i=1;i<=n;i++){add(num[i],1);for(int j=1;j<=n;j++){if(num[j]==0) continue;res[i][j]=sum(num[j]-1);}if(num[i]==0) continue;tot+=(i-sum(num[i]));}int max_=-1;int ans=0;for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){if(num[i]>num[j]){int tn=j-i-1;int si=res[j][i]-res[i][i];int bi=tn-si;int sj=res[j][j]-res[i][j];int bj=tn-sj;int t=si-bi+bj-sj-1;if(t>max_){max_=t;ans=1;}else if(t==max_){ans++;}}}}   printf("%d %d\n",tot-max_,ans);
}

CF 362C 冒泡排序 交换哪两个数逆序数减少最多相关推荐

  1. 【排序】归并类排序—归并排序(逆序数问题)

    文章目录 前言 归并排序(merge sort) 逆序数 结语 微信公众号:bigsai 数据结构与算法专栏 前言 在排序中,我们可能大部分更熟悉冒泡排序.快排之类.对归并排序可能比较陌生.然而事实上 ...

  2. 全排列,逆序数与行列式的二三事

    行列式计算 在线性代数中,我们接触到了行列式的定义及相关计算,现在我们可以用C语言来帮助我们实现行列式的计算 一起来把这个顽固的行列式算出来(╯‵□′)╯︵┻━┻ 行列式计算方式 首先先来回顾一下行列 ...

  3. 光影切割问题之求解逆序数

    1. 问题 编程之美1.7光影切割问题可以概括为: 设有两条完全相同的垂直方向上的两条长度相同的线段a和b,且它们对应的端点在同一水平线上.       已知:在这两条线段之间存在n条线段,且每条线段 ...

  4. N 个互异数的数组的平均逆序数

    N 个互异数的数组的平均逆序数为 N(N−1)/4N(N-1)/4 1. 简单证明 对于任意的数的表 LL(5,8,9,6,4),以及其反序表 LrL_r(4,6,9,8,5),它们各自的逆序数分别为 ...

  5. 树桩数组求逆序数+离散化(数太大)

    http://acm.hdu.edu.cn/showproblem.php?pid=3743 求a1 a2 a3 ...an此序列的逆序数 怎么离散化? 首先将序列由小到大排序, 用排序后该数的位置代 ...

  6. python输入一个三位数、输出它的逆序数值_c语言 从键盘输入一个三位数,输出该数的逆序数。c语言中从键盘输入一个三位整数...

    c语言 从键盘输入一个三位数,输出该数的逆序数. c语言中从键盘输入一个三位整数 www.zhiqu.org     时间: 2020-12-08 c语言中从键盘输入一个三位数,输出该数的逆序数,可以 ...

  7. 全排列与逆序数的组合

    之前也做过这类题,现在做又忘了,整理一下. ACM中遇到逆序数最多的就是 全排列+逆序数 引入 这样一题: 给出n个数字,求使用冒泡排序所需要交换的次数(n到5e5)(POJ2299) 问题可以转化为 ...

  8. 【归并排序】【逆序数】HDU 5775 Bubble Sort

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 题目大意: 冒泡排序的规则如下,一开始给定1~n的一个排列,求每个数字在排序过程中出现的最远端 ...

  9. 通过交换相邻数来完成排序所需要的最少交换次数

    对一个无序序列进行排序,要求一次只能交换相邻的两个数,那么最少需要交换多少次才可以完成排序呢? 本问题假设序列所有数各不相同. 概念介绍: 1.逆序.一般认为从左向右序列的数字增大认为是正序的,那么从 ...

最新文章

  1. 如何确定Scrum团队的最佳规模?
  2. 什么是Java内存模型中的happens-before
  3. boost::mpl模块as_sequence的测试程序
  4. MVC5管道处理模型
  5. 推荐一套高效的码字工具
  6. SAP Spartacus UI 服务器端渲染的调试启动方式 - debug 模式
  7. mvc json 乱码_你了解JSON吗?——Jackson、FastJson在SpringMVC中的简单使用
  8. JS学习笔记2-JavaScript 语法
  9. linux清除log日志,linux清除log日志
  10. python web 并发 性能_Python Web Server的性能测试
  11. 字符编码(ucs2 ucs4 utf)
  12. Codeforces Round #430 D. Vitya and Strange Lesson
  13. 的列数 获取mysql_阿里面试:MySQL如何设计索引更高效?
  14. python图像边缘检测_python 简单图像处理(11) 空间域图像锐化(边缘检测)
  15. Java 8实战-Stream 查找替换 VS 归约reduce
  16. 使用jeDate日期控件
  17. linux拷贝安装包到另一个目录下,把windows下的压缩包放到Linux目录下去
  18. 啊哈 , 算法 !--深度优先搜索( C语言版 )
  19. 《“理想我”与“现实我”》
  20. 蓝牙耳机与电脑连接篇

热门文章

  1. 最新优优博客系统2.5版/THinkphp5.0开源个人博客系统+多语言
  2. 中职教材计算机英语,浅析中职计算机英语校本教材的编写
  3. 前端性能优化的一些技巧(90% chatGpt生成)
  4. 快递老大顺丰,首次披露自己的技术“护城河”
  5. Android动画屏保,Android Daydream 互动屏保
  6. 养龟经验总结,原创哦
  7. 【华为校招机试 2023】 简单的自动曝光、平均像素值(C++ Java JavaScript Python)
  8. 使用天天模拟器开发android应用
  9. JavaScript Math.PI 属性
  10. 新媒体运营课程能学到东西吗