博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小朋友排队
阅读量:3951 次
发布时间:2019-05-24

本文共 608 字,大约阅读时间需要 2 分钟。

对于每一个位置的高度,如果想要交换次数最少,肯定要把在它后边比它小的换到前面,在它前面比它大的换到后边。然后我们发现其实这就是求整个序列的逆序对数,普通的暴力方法求逆序对肯定会超时,我们采用树状数组求逆序对。然后对于每个位置求得的结果带入等差数列求和公式求得结果。

代码如下:

#include
using namespace std;int n;int c[100007],d[100007];long long ans[100007];struct node{
int val; int pos;}p[100007];int lowbit(int x){
return x&(-x);}bool cmp(node x,node y){
return x.val
=1;i--) {
in(d[i]); ans[i]+=getsum(d[i]-1);//求得应该在这个位置后边但是在这个位置前面的个数 } long long sum=0; for(int i=1;i<=n;i++) {
sum+=(ans[i]+1)*ans[i]/2;//等差数列求和公式求和 } printf("%lld\n",sum); return 0;}

转载地址:http://dsgwi.baihongyu.com/

你可能感兴趣的文章
VS2008 CString转char字符串
查看>>
VS2008 如何设置mfc对话框最小化
查看>>
VS2008向MFC 对话框 添加托盘图标(显示和消失)
查看>>
托盘使用--最小化到托盘,双击托盘立即还原显示
查看>>
ORACLE客户端连接配置 tnsnames.ora内容
查看>>
Ubuntu 12.04添加开机启动项
查看>>
MFC对话框使用标签页控件
查看>>
redhat中vsftp开机自启动
查看>>
修改RedHat默认登录方式
查看>>
按字段值分组表中记录
查看>>
windows批处理实现telnet登陆和运行命令--还有问题
查看>>
windows批处理实现telnet登陆和运行命令--设置缺省输入法为英文
查看>>
freetds使用-远程访问SQL Server库
查看>>
linux获得系统编码
查看>>
Ubuntu安装glib
查看>>
MySQL存储过程,生成大量数据
查看>>
查询字段值出现多次的字段值
查看>>
SQL Server表存在则进行查重 SQL语句
查看>>
redhat 9 下sqlite 3的安装及编程
查看>>
两个同步表的字段复制.Oracle.
查看>>