小朋友排队问题(树状数组

  • 问题描述
    • 分析
    • c语言代码实现

问题描述

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。

 时间限制:1.0s 内存限制:256.0MB

分析

统计每位小朋友右边有多少比他高的,最后汇总怒气值
通过树状数组的特性,将身高数组值转为树状数组下标,将每一位都更改为1
对数组进行顺序扫描和反向扫描;

  通过顺序扫描,更改一位,求出对应的sum值(该sum值表示从第一位数据到该位数据和,在此处用于表示该数据前面有小于等于该数据的元素)通过总添加人数-去该sum得出大于该数据的人数(交换次数)并保存cnt数组因为前些操作导致c数组中数组发生了改变,所以应对c数组再次进行更改 进行反向扫描 最后汇总每位小朋友的交换次数

c语言代码实现

#include<stdio.h>
#include<string.h>
int lowbit(int n);
void update(int n,int i,int v,int c[]);
int getsum(int c[],int k); int h[100000];           //身高数组
int c[1000001];         //树状数组,因为要将身高转为下标,身高可能为零,树状数组下标从1开始
int cnt[100000];        //用于记录每位小朋友的交换次数    int main()
{int n;scanf("%d",&n); int maxHit=-1;        //用于保存最大身高 for(int i=0;i<n;i++){scanf("%d",&h[i]);if(h[i]>maxHit) maxHit=h[i]; }
//  memset(h,sizeof(h));    //初始化 memset(c,0,sizeof(c));//顺序扫描for(int i=0;i<n;i++){update(maxHit+1,h[i]+1,1,c);     //将树状数组中身高相对应的值更改为1int sum = getsum(c,h[i]+1);    //得到该位置的sum值,表示当前小于等于该数据的个数cnt[i]+=(i+1)-sum;         //得到,大于该数据的个数,((i+1)表示进入了算当前已经有多少个数据了,而sum表示当前小于该数据的个数) } memset(c,0,sizeof(c));            //重新初始化该数据 //反向扫描for(int i=n-1;i>=0;i--){update(maxHit+1,h[i]+1,1,c);//  int sum=getsum(c,h[i]+1); //小于等于该数据的个数//  int self=getsum(c,h[i]+1)-getsum(c,h[i]);  //该数据的个数//  int cnt[i]+=sum-self;         //当前数据右侧小于该数据的个数 cnt[i]+=getsum(c,h[i]);          //右侧小于该数据的个数 } //汇总怒气值long long ans=0;             //怒气值 for(int i=0;i<n;i++){ans+=(1+cnt[i])*cnt[i]/2;       //1+2+3+....+n   (1+n)*n/2} printf("%lli\n",ans);
} int lowbit(int n)
{return n-(n&(n-1));            //n-1:二进制中变化:消除了源数中二进制中最后一个1//(n-1)&n:    彻底去除最后一个1//n-(n&(n-1)):保留最后一个1
} void update(int n,int i,int v,int c[])        //在k位置增加v更新c数组
{//从i位置开始更新,增加lowbit找到下一个位置 for(int k=i;k<=n;k+=lowbit(k)){c[k]+=v;     //在每一与当前位置相关的位置都需要更新 } } //求k二进制最后一个1代表的十进制数 //求前k项和
int  getsum(int c[],int k)
{int sum=0;for(int i=k;i>=1;i-=lowbit(i)){sum+=c[i];} return sum;
}

小朋友排队问题(树状数组)相关推荐

  1. [蓝桥杯][历届试题]小朋友排队(树状数组)

    题目描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的时候,所有小朋友的不高兴程度都是0. 如果某个小朋友 ...

  2. 蓝桥杯2014届试题9题 小朋友排队(树状数组+类逆序对)

    题目: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的 ...

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

    问题描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的时候,所有小朋友的不高兴程度都是0. 如果某个小朋友 ...

  4. BZOJ 2141 排队(块套树,分块,树状数组)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2141 是 hydro 的 BZOJ ...

  5. 第五讲 树状数组与线段树 【未完结】

    目录 1264. 动态求连续区间和 [树状数组板子题] 1265. 数星星 [树状数组变种] 1270. 数列区间最大值 [线段树 / 区间内求最大值] 1215. 小朋友排队 [树状数组] AcWi ...

  6. [蓝桥杯][算法提高VIP]分苹果(差分||树状数组)

    题目描述 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1-N.有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li+1个小朋友每人发Ci个苹果. 最后老师想知道每个小朋友有多少苹 ...

  7. ★【树状数组】【NOI2008】糖果雨

    [问题描述] 有一个美丽的童话:在天空的尽头有一个"糖果国",这里大到摩天大厦,小到小花小草都是用糖果建造而成的.更加神奇的是,天空中飘满了五颜六色的糖果云,很快糖果雨密密麻麻从天 ...

  8. AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

    文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...

  9. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

最新文章

  1. 基于vue的移动web app页面缓存解决方案
  2. set的用法及短语_人教版九全Unit 14重点短语、重点句型、课文讲解
  3. iOS8开发~UI布局(一)初探Size Class
  4. Beaglebone Back学习五(PWM测试)
  5. windows 根据进程id获得进程名称 C++
  6. 基于Python-turtle库绘图(汇总)
  7. 超大背包问题(折半枚举, 双向搜索)
  8. 胡明浩 160809313 (我就会三个)
  9. 关于异常你还不知道的
  10. 关于linux驱动管理笔记
  11. python线性回归预测波士顿房价_预测波士顿的房价|简单的线性回归入门
  12. [HAOI2006]旅行comf(枚举+最小生成树)
  13. 充分了解Web语义化
  14. UIImageView 显示不规则图片,类似微信聊天气泡图片展示效果
  15. 发布一篇通过foxmail订阅rss的方法
  16. 前端解决web端 125%,150%缩放,1366*768分辨率兼容问题
  17. 常常被问路吗?我今年一共 26 次!
  18. e470c拆机图解全拆 thinkpad_thinkpad t470怎么样?thinkpad t470拆机图解全面评测
  19. 音频转换通项目案例简单过程分享
  20. remove.bg - 自动抠图、一键去除图片背景的免费在线工具

热门文章

  1. 新型Linux恶意软件隐藏在无效日期中、黑客通过微软漏洞监视目标电脑|11月26日全球网络安全热点
  2. js 按照中文拼音来排序
  3. LabVIEW 通讯与罗克韦尔 AB Allen Bradley PLC通讯 EhernetIP 网口TCP标签通讯 SL500实测通过
  4. Ubuntu 18 安装截图工具 flameshot
  5. Java-对象转型(casting)
  6. 使用windows为Android手机进行瘦身
  7. 2021.11.10 - 145.提莫攻击
  8. linux生成xorg,生成xorg.conf文件
  9. Java实现计数排序
  10. 最终幻想13-2时钟迷题破解工具