bzoj2058: [Usaco2010 Nov]Cow Photographs(逆序对)

      题目大意:给出n个数的序列,每次可以交换相邻的两个数,问把序列变成编号i在编号i+1左边,编号1在编号n右边(一个环)最少需要多少步。如:35421最少交换两次变为34512。

      一开始看到这题,只会O(n²),后来仔细想了一下,妙啊,妙不可言。

      首先我们求出逆序对,即为这个序列变成升序排列的最小次数,问题就在于23451这类的怎么求了。突然,灵稽一动,我们只要把1改成6,然后就可以算出23456的答案,即23451的答案。至于方法,就是我们通过原序列逆序对数量减去1产生的逆序对数量,然后加上给序列添加6产生的逆序对数量,就是23451的答案了。接下来同理,把2改成7,于是我们就可以递推出34512的答案了,以此类推算出所有情况的答案。。。总结一下方法就是把上一次算出来的答案减去现在序列里最小数产生的逆序对数量,然后加上给序列添加最大数+1产生的逆序对数量。

      显然,序列里没有一个数比最小数小(一句废话>_<),所以它产生的逆序对数量就是最小数的位置-1;显然,序列里没有一个数比最大数大(两句废话>_<),所以最大数产生的逆序对数量就是这个数后面的数的数量,即n-最大数的位置,也就是ans[i]=ans[i-1]-(pos[i]-1)+(n-pos[i]),然后我们就输出min(ans[i])就行啦。

      妙啊,妙不可言

代码如下:

uses math;
varn,i:longint;ans,sum:int64;a,b,c:array[0..1000000]of int64;procedure merge(l,m,r:longint);
varl1,m1,k,i:longint;
beginl1:=l;m1:=m+1;k:=l;while (l1<=m)and(m1<=r)dobeginif a[l1]<=a[m1] thenbeginb[k]:=a[l1];inc(l1);inc(k);endelsebeginb[k]:=a[m1];inc(m1);inc(k);ans:=ans+m-l1+1;end;end;while l1<=m dobeginb[k]:=a[l1];inc(l1);inc(k);end;while m1<=r dobeginb[k]:=a[m1];inc(m1);inc(k);end;for i:=l to r do a[i]:=b[i];
end;procedure sort(l,r:longint) ;
varmid:longint;
beginif l=r then exit;mid:=(l+r)>>1;sort(l,mid);sort(mid+1,r);merge(l,mid,r);
end;beginreadln(n);for i:=1 to n dobeginread(a[i]);c[a[i]]:=i;end;sort(1,n);sum:=ans;for i:=1 to n dobeginsum:=sum-(c[i]-1)+(n-c[i]);ans:=min(ans,sum);end;writeln(ans);
end.
View Code

 

转载于:https://www.cnblogs.com/Sakits/p/5837039.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sap实施和开发哪个前景_2021年了!还不知道 SAP顾问的职业前景?

一、先说什么是SAP。百度词条的解释&#xff1a;SAP有两个意思一为“System Applications and Products”的简称&#xff0c;是SAP公司的产品——企业管理解决方案的软件名称。也代指SAP公司。二为SAP开发的ERP&#xff08;Enterprise-wide Resource Planning&#xff09;软件名…

Linux找最大最小值的命令,Linux中awk命令正确的求最大值、最小值、平均值、总和...

test.txt文件内容&#xff1a;911352142118求最大值&#xff1a;awk BEGIN {max 0} {if ($10 > max0) max$1} END {print "Max", max} test.txtMax 118求最小值&#xff1a;awk BEGIN {min 65536} {if ($10 < min0) min$1} END {print "Min", min}…

​分布式数据库技术基础:数据分布介绍

1、数据分布的定义数据分布是指在分布式环境中通过合理分布数据&#xff0c;提高数据操作自然并行度&#xff0c;以达到最优的执行效率的目的。在构建分布式数据库系统运行环境时&#xff0c;必须考虑数据如何分布在系统的各个场地上。数据分布主要关注的问题是在分布式数据中&…

uname命令 linux,Linux uname命令详解

Linux uname命令用于显示系统信息。uname可显示电脑以及操作系统的相关信息。语法参数&#xff1a;uname [参数]参数&#xff1a;-a或--all&#xff1a;显示全部的信息&#xff1b;-m或--machine&#xff1a;显示电脑类型&#xff1b;-n或-nodename&#xff1a;显示在网络上的主…

ios开发text kit_IOS开发入门之TextKit详解

本文将带你了解IOS开发入门iOS 开发 富文本详解之TextKit详解&#xff0c;希望本文对大家学IOS有所帮助。textkit结构textkit使用步骤#Mark - 1. 自定义label --class CZLabel: UILabel---四个属性//1.属性文本存储private lazy var textStorage NSTextStorage()//2.负责文本…

分布式数据库技术基础:数据分片介绍

1、数据分片定义数据分片也成为数据分割&#xff0c;是分布式数据库的特征之一。一般在一个分布式数据库中&#xff0c;全局数据库是由各个局部数据库逻辑组合而成的&#xff0c;反之各个局部数据库是由全局数据库的某种分割逻辑而得的。数据分片得到的各部分元组成为该关系的逻…

9.02

1.input标签&#xff1a;<input> 标签用于搜集用户信息。根据不同的 type 属性值&#xff0c;输入字段拥有很多种形式。 输入字段可以是文本字段、复选框、掩码后的文本控件、单选按钮、按钮等等。例如&#xff1a;Frist name:<input type"text" name"…

分布式数据库技术基础:分布透明性相关知识

1、分布透明性介绍数据分布独立性&#xff1a;主要是指用户或用户程序使用分布式数据库如同使用集中式数据库那样&#xff0c;不必关系全局数据的分布情况。也就是说全局数据的逻辑分片、片段的物理位置分配、各场地数据库的数据模型等情况对用户和用户应用程序是透明的。因此分…

宏基4750网卡驱动linux,宏基4750g网卡驱动下载

宏基4750g网卡驱动是宏基笔记本上网驱动&#xff0c;驱动可以帮助用户体验便捷上网功能&#xff0c;只需要的双击驱动安装就可以完成&#xff0c;网卡驱动是笔记本必备程序&#xff0c;欢迎用户来当易网下载体验&#xff01;驱动介绍Acer宏碁Aspire 4750G笔记本网卡驱动14.4.0.…

python request post 数组_[pve][python]用python3获取pve状态信息

手头的Proxmox VE集群和节点越来越多&#xff0c;需要考虑统一管理了&#xff0c;先定一个小目标——集中状态监控。以前写过检测ceph并用钉钉报警的bash脚本&#xff0c;这次换上洋气的方式&#xff0c;用python来通过pve的api获取其状态信息。首先参考proxmox官方的api(实际上…

分布式数据库管理系统介绍

1、分布式数据库管理系统分类综合型体系结构&#xff1a;主要是指在分布式数据库建立之前&#xff0c;还没有建立独立的集中式数据库管理系统&#xff0c;设计人员根据用户的需求&#xff0c;设计出一个全新的完整的数据库管理系统。联合型体系结构&#xff1a;主要是指每个节点…

linux中国用户,Linux中国 适合新用户的Linux

这个争论无疑给许多Linux用户带来了麻烦。争论的焦点一般不是哪个发行版是真正最适合新用户的&#xff0c;而是哪个发行版受这些争论者的喜爱。如果我们撇开个人喜爱&#xff0c;我们会看到更清楚的一面。但即使这样&#xff0c;明确的结论也会受到被新用户的需求和期望的影响。…

关于局部变量表slot的理解

看下图代码例子&#xff0c;double类型的b,占用两个slot,所以index为3和4

Spring LDAP

LDAP Spring LDAP 使用 - Sayi像秋天一样优雅 - 开源中国社区 http://docs.spring.io/spring-ldap/docs/current/reference/#introduction http://blog.csdn.net/techchan/article/details/5438047转载于:https://www.cnblogs.com/hello-yz/p/5844784.html

挂起某线程命令 Linux,linux 线程挂起恢复的简单示例

参考&#xff1a;写了个demo&#xff1a;#include #include static pthread_mutex_t mutex;static pthread_cond_t cond;static int flag 0;void srpthread_init(){pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond,NULL);}void srpthread_suspend(){pthread…

分布式查询处理和优化相关知识介绍

一、分布式数据库查询考虑的因素1、和集中式数据查询一样需要考虑查询语言语句的优化2、数据和信息均需要通过通信线路进行数据传输&#xff0c;存在传输延迟问题从而影响整个查询的执行效率。3、网络中多处理器的存在提供了并行数据处理和传输的机会&#xff0c;可以充分利用该…

html下拉框设置默认值_如何设置HTML select下拉框的默认值?

HTML中的select标签用于创建可选择选项的下拉列表&#xff1b;option标签包含选定时将使用的值。那么如何来设置select下拉框里的默认值&#xff1f;下面本篇文章就来给大家介绍一下&#xff0c;希望对大家有所帮助。我们可以在所需选项上使用“selected”属性来设置select元素…