CF 362C 冒泡排序 交换哪两个数逆序数减少最多
交换两个数,求使得排列的逆序数最多减少多少,以及有多少个这样的数对
数据范围有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 冒泡排序 交换哪两个数逆序数减少最多相关推荐
- 【排序】归并类排序—归并排序(逆序数问题)
文章目录 前言 归并排序(merge sort) 逆序数 结语 微信公众号:bigsai 数据结构与算法专栏 前言 在排序中,我们可能大部分更熟悉冒泡排序.快排之类.对归并排序可能比较陌生.然而事实上 ...
- 全排列,逆序数与行列式的二三事
行列式计算 在线性代数中,我们接触到了行列式的定义及相关计算,现在我们可以用C语言来帮助我们实现行列式的计算 一起来把这个顽固的行列式算出来(╯‵□′)╯︵┻━┻ 行列式计算方式 首先先来回顾一下行列 ...
- 光影切割问题之求解逆序数
1. 问题 编程之美1.7光影切割问题可以概括为: 设有两条完全相同的垂直方向上的两条长度相同的线段a和b,且它们对应的端点在同一水平线上. 已知:在这两条线段之间存在n条线段,且每条线段 ...
- N 个互异数的数组的平均逆序数
N 个互异数的数组的平均逆序数为 N(N−1)/4N(N-1)/4 1. 简单证明 对于任意的数的表 LL(5,8,9,6,4),以及其反序表 LrL_r(4,6,9,8,5),它们各自的逆序数分别为 ...
- 树桩数组求逆序数+离散化(数太大)
http://acm.hdu.edu.cn/showproblem.php?pid=3743 求a1 a2 a3 ...an此序列的逆序数 怎么离散化? 首先将序列由小到大排序, 用排序后该数的位置代 ...
- python输入一个三位数、输出它的逆序数值_c语言 从键盘输入一个三位数,输出该数的逆序数。c语言中从键盘输入一个三位整数...
c语言 从键盘输入一个三位数,输出该数的逆序数. c语言中从键盘输入一个三位整数 www.zhiqu.org 时间: 2020-12-08 c语言中从键盘输入一个三位数,输出该数的逆序数,可以 ...
- 全排列与逆序数的组合
之前也做过这类题,现在做又忘了,整理一下. ACM中遇到逆序数最多的就是 全排列+逆序数 引入 这样一题: 给出n个数字,求使用冒泡排序所需要交换的次数(n到5e5)(POJ2299) 问题可以转化为 ...
- 【归并排序】【逆序数】HDU 5775 Bubble Sort
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 题目大意: 冒泡排序的规则如下,一开始给定1~n的一个排列,求每个数字在排序过程中出现的最远端 ...
- 通过交换相邻数来完成排序所需要的最少交换次数
对一个无序序列进行排序,要求一次只能交换相邻的两个数,那么最少需要交换多少次才可以完成排序呢? 本问题假设序列所有数各不相同. 概念介绍: 1.逆序.一般认为从左向右序列的数字增大认为是正序的,那么从 ...
最新文章
- 如何确定Scrum团队的最佳规模?
- 什么是Java内存模型中的happens-before
- boost::mpl模块as_sequence的测试程序
- MVC5管道处理模型
- 推荐一套高效的码字工具
- SAP Spartacus UI 服务器端渲染的调试启动方式 - debug 模式
- mvc json 乱码_你了解JSON吗?——Jackson、FastJson在SpringMVC中的简单使用
- JS学习笔记2-JavaScript 语法
- linux清除log日志,linux清除log日志
- python web 并发 性能_Python Web Server的性能测试
- 字符编码(ucs2 ucs4 utf)
- Codeforces Round #430 D. Vitya and Strange Lesson
- 的列数 获取mysql_阿里面试:MySQL如何设计索引更高效?
- python图像边缘检测_python 简单图像处理(11) 空间域图像锐化(边缘检测)
- Java 8实战-Stream 查找替换 VS 归约reduce
- 使用jeDate日期控件
- linux拷贝安装包到另一个目录下,把windows下的压缩包放到Linux目录下去
- 啊哈 , 算法 !--深度优先搜索( C语言版 )
- 《“理想我”与“现实我”》
- 蓝牙耳机与电脑连接篇
热门文章
- 最新优优博客系统2.5版/THinkphp5.0开源个人博客系统+多语言
- 中职教材计算机英语,浅析中职计算机英语校本教材的编写
- 前端性能优化的一些技巧(90% chatGpt生成)
- 快递老大顺丰,首次披露自己的技术“护城河”
- Android动画屏保,Android Daydream 互动屏保
- 养龟经验总结,原创哦
- 【华为校招机试 2023】 简单的自动曝光、平均像素值(C++ Java JavaScript Python)
- 使用天天模拟器开发android应用
- JavaScript Math.PI 属性
- 新媒体运营课程能学到东西吗