AcWing 1215. 小朋友排队 (树状数组)

n n n 个小朋友站成一排。

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

每个小朋友都有一个不高兴的程度。

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

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

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

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

输入格式
输入的第一行包含一个整数 n n n,表示小朋友的个数。

第二行包含 n n n 个整数 H 1 , H 2 , … , H n H_1,H_2,…,H_n H1,H2,,Hn,分别表示每个小朋友的身高。

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

数据范围
1 ≤ n ≤ 100000 , 1≤n≤100000, 1n100000,
0 ≤ H i ≤ 1000000 0≤H_i≤1000000 0Hi1000000
输入样例:

3
3 2 1

输出样例:

9

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


首先明确只能相邻的人之间换,而且每次换的时候,比如 1 1 1 2 2 2 换,那么他们两个人的不高兴都会加上他们各自交换过的次数。

对于样例我们只看中间的 2,2 的左边有一个 3,这个 3 应该在 2 的右边,2 的右边有一个 1,这个 1 应该在 2 的左边,不管怎么换 2 都会被换两次,因为如果 2 先和 3 换,3 和 1 换,1 和 2 换, 2 换了两次,如果 2 先和 1 换, 3 和 1 换,3 和 2 换,2 还是换了两次。

对于 1 也是,因为左边有两个比他大的,所以 1 要换两次。

对于任何一个数,如果左边有比他大的,就一定要跨过他去,如果右边有比他小的,也一定要跨过他去,这么下来就交换了左边比他大的个数加右边比他小的个数的次数,这样得来的就已经是最小的交换次数了,因为不可能比这个小的情况,如果有就不满足升序了。

那么我们就需要实现求出来某个数左边比他大的数的个数和右边比他小的数的个数。可以有很多方法,这里使用树状数组实现。

这里树状数组代表的是某个数有没有,如果有就是 1,没有就是 0 。
之后如果要求a[i]的左边比它大的数,只要求从左边扫过去,然后求出最大高度的前缀和减去a[i]的前缀和
求右边的比当前数小的数则是从右边扫,其他的同理。

此种做法是树状数组的一种管用用法,可以参考树状数组的笔记

代码:

#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 10;
const int M = 1e6 + 10;int tr[M];
int a[N];
int n;
int times[N];	//存每个数的交换个数int lowbit(int x) { return x & -x; }
void add(int x, int c) {for (int i = x; i <= M; i+=lowbit(i))tr[i] += c;
}
int sum(int x) {int res = 0;for (int i = x; i; i -= lowbit(i))res += tr[i];return res;
}int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];a[i] ++;}for (int i = 1; i <= n; i++) {times[i] = sum(M) - sum(a[i]);add(a[i], 1);}memset(tr, 0, sizeof tr);for (int i = n; i >= 1; i--) {times[i] += sum(a[i] - 1);add(a[i], 1);}long long res = 0;for (int i = 1; i <= n; i++) {res += (long long)(1 + times[i]) * times[i] / 2;	//注意根据题目条件,答案要求等差数列的和}cout << res;return 0;
}

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

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

相关文章

蓝桥杯的数论总结

声明 我只是把数论相关的东西放在了一起&#xff0c;会有自己的理解&#xff0c;所以会有错误哈&#xff0c;欢迎在评论区中指出&#xff0c;另外有啥看不懂的也可以在评论区留言&#xff0c;我看到后就回你 质数 暴力 质数一般都是奇数&#xff0c;除了2小于2的不用考虑了…

Elasticsearch优化

集群配置 1、调整副本数&#xff1a;考虑数据的可用性和读取性能&#xff0c;合理配置分片的副本数。 2、合理配置分片大小(分片的合理容量&#xff1a;10GB-50GB)&#xff1a;避免分片过大&#xff0c;以确保更好的性能和均衡的负载。 3、监控集群状态&#xff1a;使用监控工…

mysql服务

任务描述:请安装mysql服务,建立数据表。 配置linux2为mysql服务器,创建数据库用户xiao,在任意机器上对所有数据库有完全权限。 创建数据库userdb;在库中创建表userinfo,表结构如下: 字段名 数据类型 主键

vue3+threejs新手从零开发卡牌游戏(十六):初始化对方手牌

添加对方手牌区时注意位置调整&#xff0c;以及手牌应该是背面朝上&#xff0c;加个rotateX翻转即可&#xff0c;其他代码和p1.vue代码一致&#xff0c;game/hand/p2.vue代码如下&#xff1a; <template><div></div> </template><script setup lan…

STL的基本概念

一、STL的诞生 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西 C的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升 面向对象的三大特性(简单理解) 封装&#xff1a;把属性和行为抽象出来作为一个整体来实现事和物 继承&#xff1a;子类继承父类&a…

目前可用的免费云服务器整理汇总

随着云计算技术的飞速发展&#xff0c;越来越多的企业和个人开始关注并使用云服务器。为了吸引用户上云&#xff0c;各大云服务商纷纷推出了免费云服务器&#xff0c;供用户免费试用。本文将为大家整理汇总目前市场上可用的免费云服务器&#xff0c;以便大家更好地选择适合自己…

GIS与Python机器学习:开创地质灾害风险评价新纪元

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

Verilog语言中parameter、localparam和符号常量的深度解析

1.parameter常量&#xff08;符号常量&#xff09; 用parameter来定义一个标示符&#xff0c;代表一个常量&#xff0c;称为符号常量 格式&#xff1a;parameter 参数名1 表达式&#xff0c; 参数名2 表达式&#xff1b;parameter 参数型数据的确认符&#xff0c;后边的为赋…

【C++】缺省参数

缺省参数是为函数的参数指定一个缺省值&#xff0c;调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值。 void Test(int a 10) {cout << a << endl; }int main() {Test(); // 不传参默认10Test(100); // 指定传参100return 0; }缺省参数分为全缺省和…

【 代码随想录算法训练营第三十七天 | LeetCode738.单调递增的数字、968.监控二叉树】

代码随想录算法训练营第三十七天 | LeetCode738.单调递增的数字、968.监控二叉树 一、738.单调递增的数字 解题代码C&#xff1a; class Solution { private:// 判断一个数字的各位上是否是递增bool checkNum(int num) {int max 10;while (num) {int t num % 10;if (max &g…

Unity编辑器功能 将选中的文件夹复制一份到其他文件夹

[MenuItem("Ab包工具/将选中的文件移动到StreamingAssets文件夹下")] public static void MoveFireToStreamA() { //得到选中文件的数组 Object[] selectobj Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); i…

1114. 棋盘问题

在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。 要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放 k&#xfffd; 个棋子的所有可行的摆放…

web渗透测试漏洞流程:红队目标信息收集之基础资产信息收集

web渗透测试漏洞流程 1.企业目标信息的确认2.企业目标信息的收集1.2 企业目标信息的列表1.2.1 企业基本信息的收集1.2.1.1 企业信息收集框架1.2.1.2 企业员工信息收集1.2.1.3 企业主域名信息确认1.2.1.4 企业信息查询网站1.2.1.5 企业备案查询网站1.2.1.6 企业信用信息查询1.2.…

使用python读取csv文件快速插入postgres数据库

使用python读取csv文件快速插入postgres数据库 下面为完整代码 import pandas as pd import cStringIO import warnings from sqlalchemy import create_engine import sys reload(sys) sys.setdefaultencoding(utf8) warnings.filterwarnings(ignore) engine create…

Django之Web应用架构模式

一、Web应用架构模式 在开发Web应用中,有两种模式 1.1、前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示。前端与后端的耦合度很高 1.2、前后端分离 在前后端分离的应用模式中,后端仅返…

【物联网开源平台】tingsboard安装与编译

别看这篇了&#xff0c;这篇就当我的一个记录&#xff0c;我有空我再写过一篇&#xff0c;编译的时候出现了一个错误&#xff0c;然后我针对那一个错误执行了一个命令&#xff0c;出现了绿色的succes,我就以为整个tingsboard项目编译成功了&#xff0c;后面发现的时候&#xff…

Redis 教程系列之Redis 发布订阅(十五)

Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式&#xff1a;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1 &#xff0c; 以及订阅这个频道的三个客户端 —— client2 、 client5 和 cl…

【业界动态】数字孪生到底意味着什么

什么是数字孪生&#xff1f;它可以理解为一种技术&#xff0c;也可以理解为某种生态。数字孪生即指将物理实体映射至虚拟空间&#xff0c;进而协助完成预测、决策等动作。随着互联网的建设与发展&#xff0c;数字孪生在未来又会如何落地&#xff1f; 一、数字孪生到底是什么&am…

抗干扰段码屏驱动芯片/ LCD液晶屏驱动/仪器仪表液晶驱动IC-VK1C21D/DA FAE支持

产品型号&#xff1a;VK1C21D/DA 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP28/SSOP28 可定制裸片&#xff1a;DICE(COB邦定片)&#xff1b;COG(邦定玻璃用) 工程服务&#xff0c;技术支持&#xff01; 概述&#xff1a; VK1C21D/DA是一个点阵式存储映射…

【C/C++】C++中的四种强制类型转换

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…