题干:

问题描述

  n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。

  每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。

  如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。

  请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。

  如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。

输入格式

  输入的第一行包含一个整数n,表示小朋友的个数。
  第二行包含 n 个整数 H1 H2 … Hn,分别表示每个小朋友的身高。

输出格式

  输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。

样例输入

3
3 2 1

样例输出

9

样例说明

  首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友,再交换身高为2和1的小朋友,每个小朋友的不高兴程度都是3,总和为9。

数据规模和约定

  对于10%的数据, 1<=n<=10;
  对于30%的数据, 1<=n<=1000;
  对于50%的数据, 1<=n<=10000;
  对于100%的数据,1<=n<=100000,0<=Hi<=1000000。

解题报告:

我就说嘛、、、过了70%,不可能是思路错误,,检查了半天发现最后的统计答案爆了longlong、、、气死我了。

这题的关键在于看到交换的条件是:只能交换相邻的两个元素。这就使得问题简单了很多。考虑到x这个数,假设最后肯定要被交换到对应的位置上,那么看最少需要被交换多少次,在看这个次数能否可以实现。不难发现,最少被交换的次数,就是和前面比他大的数字,并且和后面比他小的数字。所以求该数对应的逆序数就行了。那么这个次数能否实现呢?不妨这样想,只考虑第i个数,假设前面比他大的有x1个,后面比他小的有x2个,我们先想办法将他前面比他大的数都交换到他后面去,这样他移动的次数就肯定是x1,并且得到的这样一个状态肯定是在他本该在的位置的前面,然后我们再通过和后面的数字的交换让他回到原来的位置就可以了,这一套操作是x2次,所以总次数可以达到x1+x2次。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e6 + 5;
int a[MAX];
int c[MAX];
int lowbit(int x){return x&(-x);}
int query(int x) {int res = 0;while(x>0) {res += c[x];x-=lowbit(x);}return res;
}
void update(int x,int val) {while(x<MAX) {c[x] += val;x+=lowbit(x);}
}
int ans1[MAX],ans2[MAX],ans[MAX];
int main()
{int n;cin>>n;for(int i = 1; i<=n; i++) {scanf("%d",a+i);a[i]++;}for(int i = n; i>=1; i--) {ans1[i] = query(a[i]-1);update(a[i],1);}memset(c,0,sizeof c);for(int i = 1; i<=n; i++) {ans2[i] = query(1000010) - query(a[i]);update(a[i],1);}for(int i = 1; i<=n; i++) ans[i] = ans1[i] + ans2[i];ll res = 0;for(int i = 1; i<=n; i++) {res += 1LL*(1+ans[i])*ans[i]/2;}printf("%lld\n",res);return 0 ;
}

【蓝桥杯官网试题 - 历届试题】小朋友排队(逆序数,树状数组)相关推荐

  1. 【蓝桥杯官网训练 - 历届试题】对局匹配(dp,思维,取模)

    题干: 问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起.如果 ...

  2. [蓝桥杯][2018年第九届真题]整理玩具(树状数组)

    题目描述 小明有一套玩具,一共包含NxM个部件.这些部件摆放在一个包含NxM个小格子的玩具盒中,每个小格子中恰好摆放一个部件. 每一个部件上标记有一个0~9的整数,有可能有多个部件标记相同的整数. 小 ...

  3. [蓝桥杯][2018年第九届真题]日志统计(树状数组)

    题目描述 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞". ...

  4. 蓝桥杯官网 试题 PREV-61 历届真题 装饰珠【第十一届】【决赛】【研究生组】【C++】【C】【Java】【Python】四种解法

    为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来.希望能对大家的成绩有所帮助. 今年的最大目标就是能为[一亿技术人]创造更高的价值. 资源限制 ...

  5. 蓝桥杯官网 试题 PREV-240 历届真题 答疑【第十一届】【决赛】【研究生组】【C++】【C】【Java】【Python】四种解法

    为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来.希望能对大家的成绩有所帮助. 今年的最大目标就是能为[一亿技术人]创造更高的价值. 资源限制 ...

  6. 蓝桥杯官网 试题 PREV-109 历届真题 扫地机器人【第十届】【省赛】【研究生组】【C++】【Java】【Python】三种解法

    为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来.希望能对大家的成绩有所帮助. 今年的最大目标就是能为[一亿技术人]创造更高的价值. 资源限制 ...

  7. 蓝桥杯官网 试题 PREV-265 历届真题 砝码称重【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法

    为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来.希望能对大家的成绩有所帮助. 今年的最大目标就是能为[一亿技术人]创造更高的价值. 资源限制 ...

  8. 蓝桥杯官网刷题记录python

    蓝桥杯官网刷题记录python 由于很多题都会在2020.2021.2022年省赛出现,有的在前面文章里做过的这里就不会再说了 一.空间 小蓝准备用 256MB 的内存空间开一个数组,数组的每个元素都 ...

  9. 蓝桥杯python组练题第二天——成绩统计——蓝桥杯官网题库

    成绩统计 题目描述 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数. 如果得分至少是 60 分,则称为及格.如果得分至少为 85 分,则称为优秀. ...

最新文章

  1. CSS自定义鼠标样式。JS获取鼠标坐标,实现提示气泡框跟随鼠标移动
  2. 网络发展的模式之一:新功能在应用系统涌现,然后逐渐迁移到基础设施
  3. 3_5 ResponsibilityChainMode 责任链模式
  4. java 打包zip下载_java web 将文件打包成 .zip后 肿么自动弹出下载框提示并下载?
  5. linux sublime3 插件安装插件,手动安装sublimeText3插件
  6. errcode: 41001, errmsg: access_token missing hint: [w.ILza05728877!]
  7. 多线程 之 生产者与消费者
  8. svg的viewport和viewbox
  9. spring与jpa整合 简化persistence.xml配置文件 使用属性文件 数据源dbcp访问数据库...
  10. VUe Eelement-ui 兼容es6 兼容IE9+ 报错:SCRIPT1003: 缺少 ':’
  11. win10计算机策略配置文件,Win10系统如何打开组策略?打开组策略的具体方法
  12. 相邻素数的差最大是多少c语言,怎么证明?相邻两个素数之差的最大值
  13. android图片按比例缩放,Android开发之imageView图片按比例缩放的实现方法
  14. VINS-Mono 代码解析六、边缘化(2)理论和代码详解
  15. java魂斗罗_向经典致敬--跟我用Java写魂斗罗
  16. 如何设置行间距和字间距?
  17. 打印机一直不停打乱码的解决方法
  18. fedora26下解决wps字体缺失(添加windows字体)
  19. 攻防世界crypto高手题之best_rsa
  20. 学习 VS2010编程经典示例

热门文章

  1. [Leetcode][第459题][JAVA][重复的字符串][子串][匹配]
  2. [剑指offer]面试题第[50]题[JAVA][第一个只出现一次的字符][哈希表][HashMap]
  3. android studio 无法输入中文,Android Studio 升级到3.0后输入法中文状态下无法选词的终极解决方案...
  4. xml生成2维码_MyBatis(2)之MyBatis-Generator最佳实践
  5. ios 部分string颜色_iOS-代码混淆加固方案
  6. phpstudy(自己电脑主机做服务器,手机网站界面打不开)
  7. mysql数据备份在哪里_mysql之数据备份与恢复
  8. 找到一个二位数组的鞍点
  9. java getapplicationcontext_java – getApplicationContext()中的空指针
  10. ST7789V2 LCD驱动芯片