AcWing 244. 谜一样的牛—树状数组、二分

题目链接 AcWing 244. 谜一样的牛

题目描述
在这里插入图片描述

分析
这道题挺巧妙的,感觉树状数组方面的题就是比较难想,先分析一下样例,样例中每头牛前面比自己低的牛的数量分别为

0 1 2 1 0

牛的高度是1~n的排列,如何分析出每头牛的高度呢,可以考虑从后往前分析
现在每头牛高度的可能性为1,2,3,4,5

第5头牛的前面有0头牛比他高,所以第5头牛高度为1

每头牛高度的可能性为 2,3,4,5

第4头牛的前面有1头牛比他高,所以第4头牛高度为3

每头牛高度的可能性为 2,4,5

第3头牛的前面有2头牛比他高,所以第3头牛高度为5

每头牛高度的可能性为 2,4

第2头牛的前面有1头牛比他高,所以第2头牛高度为4

每头牛高度的可能性为 2

第1头牛的前面有0头牛比他高,所以第1头牛高度为2

按照这个想法,这个问题就转变成了求解动态第k小数的问题,这里可以用树状数组+二分来做,首先将数组f[]的每个值都赋值为1,数组f[]树状数组为c[],树状数组用来求前缀和sum(x),二分求解最小的数x,使得sum(x)==k,那么x就是当前第k小的数,然后让f[x]-1,再找下一头牛的高度。
下面把样例模拟一边

初始
f[]		={1,1,1,1,1}
sum	={1,2,3,4,5}
第5头牛的前面有0头牛比他高,所以当前第1小牛的高度为1,f[1]=1f[]		={0,1,1,1,1}
sum	={0,1,2,3,4}
第4头牛的前面有1头牛比他高,所以当前第2(sum(x)==2的最小x)小牛的高度为3,f[3]=2f[]		={0,1,0,1,1}
sum	={0,1,1,2,3}
第3头牛的前面有2头牛比他高,所以当前第3(sum(x)==3的最小x)小牛的高度为5,f[5]=3f[]		={0,1,0,1,0}
sum	={0,1,1,2,2}
第2头牛的前面有1头牛比他高,所以当前第2(sum(x)==2的最小x)小牛的高度为4,f[4]=2f[]		={0,1,0,0,0}
sum	={0,1,1,1,1}
第1头牛的前面有0头牛比他高,所以当前第1(sum(x)==1的最小x)小牛的高度为2,f[2]=1所以牛的高度为:2 4 5 3 1

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10;int f[N],c[N];
int n;int lowbit(int x){return x&-x;
} 
void add(int idx, int x){for(int i=idx;i<=n;i+=lowbit(i)) c[i]+=x;
}
int query(int r){int res=0;for(int i=r;i;i-=lowbit(i)) res+=c[i];return res;
}int main(){cin>>n;for(int i=1;i<=n;i++) add(i,1);for(int i=2;i<=n;i++) scanf("%d",&f[i]);for(int i=n;i>=1;i--){int t=f[i]+1;int l=1,r=n;while(l<r){int mid=l+r>>1;if(query(mid)>=t) r=mid;else l=mid+1;}f[i]=r;add(r,-1);}for(int i=1;i<=n;i++) cout<<f[i]<<endl;return 0;
}

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

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

相关文章

MySQL-多表查询-小结1

目录 内连接 外连接 子查询&#xff08;嵌套查询&#xff09; 内连接 内连接查询的是表之间交集的部分隐式内连接 select 字段列表 from 表1&#xff0c;表2 where 条件....&#xff1b;显示内连接 select 字段列表 from 表1 [inner] join 表2 on 条件....&#xff1b; 外连…

API Testing 一个基于 YAML 文件的开源接口测试工具

目录 前言&#xff1a; 如何使用&#xff1f; 本地模式 服务端模式 文件格式 后续计划 前言&#xff1a; API Testing 是一个基于 YAML 文件的开源接口测试工具&#xff0c;它可以帮助开发者快速地进行接口测试。 在选择工具时&#xff0c;可以从很多方面进行考量、对比…

【历史上的今天】7 月 20 日:人类登上月球;数据仓库之父诞生;Mac OS X Lion 发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 7 月 20 日&#xff0c;在 2005 年的今天&#xff0c;时任微软全球副总裁的李开复加盟谷歌担任谷歌全球副总裁及中国区总裁。谷歌公司在发布聘请李开复消息的同…

Debezium系列之:Debezium实现对中文版SQLServer数据库数据采集的支持

Debezium系列之:Debezium实现对中文版SQLServer数据库数据采集的支持 一、背景二、Debezium实现采集SQLSever数据库数据三、验证SQL Server Agent的状态四、中文版SQLServer数据库的支持五、完整配置一、背景 Debezium2.X版本对中文版SQLServer数据库数据库的支持存在一定问题…

LiveNVR监控流媒体Onvif/RTSP功能-拉转Onvif/RTSP/RTMP/FLV/HLS直播流流媒体服务视频广场页面集成视频播放集成说明

LiveNVR拉转Onvif/RTSP/RTMP/FLV/HLS直播流流媒体服务视频广场页面集成视频播放集成说明 1、视频页面集成1.1、关闭接口鉴权1.2、视频广场页面集成1.2.1、隐藏菜单栏1.2.2、隐藏播放页面分享连接 1.3、其它页面集成 2、播放分享页面集成2.1、获取 iframe 代码2.2、html 集成ifr…

Hive 中 sort by 和 order by 的区别

order by会对输入做全局排序&#xff0c;因此只有1个reducer&#xff08;多个reducer无法保证全局有序&#xff09;&#xff0c;会导致当输入规模较大时&#xff0c;需要较长的计算时间。 sort by不是全局排序&#xff0c;其在数据进入 reducer 前完成排序。 因此&#xff0c;…

Java反射的使用

反射是Java框架的核心&#xff0c;无论是Tomcat&#xff0c;SpringMVC&#xff0c;SpringIOC&#xff0c;SpringAOP&#xff0c;动态代理&#xff0c;都使用了反射 那么什么是反射&#xff1f;-------------反射就是获取类信息的能力 Java有两种创建对象的方式&#xff1a;①…

Linux内核的块设备抽象层

Linux内核的块设备抽象层是指块设备框架的核心组件&#xff0c;它负责处理块设备I/O请求&#xff0c;向上层提交完成请求的通知&#xff0c;并提供一些与块设备相关的函数&#xff0c;包括对块设备进行初始化、打开、关闭等操作。 在块设备抽象层中&#xff0c;最基本的结构体…

ffmpeg剪切视频的一些优化(或者说是一些坑)

问题描述 最近我们在做一个项目&#xff0c;这个项目需要使用到ffmpeg这个工具来对视频进行剪切&#xff0c;也就是剪出一个视频中的某一段&#xff0c;在实际测试中&#xff0c;我们发现&#xff0c;ffmpeg剪切速度很慢&#xff0c;而且这个速度还与剪切点开始时间&#xff0…

ThreadPoolExecutor自定义线程池|拒绝策略|线程工厂|统一捕获异常

线程池的7大参数含义介绍 corePoolSize&#xff1a;池中一直保持的线程的数量。 maximumPoolSize&#xff1a;池中允许的最大的线程数。 keepAliveTime&#xff1a;当线程数大于核心线程数的时候&#xff0c;线程在最大多长时间没有接到新任务就会终止释放&#xff0c; 最终…

数据结构--栈和队列

part 1. 栈 栈是一种后进先出的结构。 常用操作&#xff1a; &#xff08;1&#xff09;清空&#xff08;clear&#xff09; &#xff08;2&#xff09;获取栈内元素个数&#xff08;size&#xff09; &#xff08;3&#xff09;判空&#xff08;empty&#xff09; &…

Python 集合 union()函数使用详解,Python合并集合

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 union函数使用详解 1、合并多个集合2、合并其他类型2.1、合并字符串2.2、合并列表…

Linux超详细的了解

文章目录 前言Linux的简介不同应用领域的主流操作系统Linux系统历史Linux系统各版本 Linux的安装安装方式介绍安装Linux网卡设置安装SSH连接工具finalShell连接虚拟机Linux和Windows目录结构对比Linux目录介绍 Linux常用命令Linux命令初体验文件目录命令ls命令cd命令cat命令mor…

Hbase基本原理剖析

一、基本原理 数据存储使用HBase来承接&#xff0c;HBase是一个开源的、面向列&#xff08;Column-Oriented&#xff09;、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统。更多关于HBase的信息&#…

html 解决css样式 缓存 ---css引入添加时间戳

通过js 对引入的css添加时间戳 <script type"text/javascript">document.write("<link relstylesheet typetext/css href./style/base.css?v" new Date().getTime() ">");document.write("<link relstylesheet typetext…

面试:浏览器常见问题-优化与兼容

前端开发浏览器优化方案有哪些&#xff1f; 以下是一些前端开发中常用的浏览器优化方案&#xff1a; 减少HTTP请求数量&#xff1a;将多个CSS和JavaScript文件合并为一个文件&#xff0c;使用CSS sprites来减少图片请求数量&#xff0c;使用字体图标替代小图标等&#xff0c;可…

IDEA: 将第三方依赖打入jar包

文章目录 一、添加自定义的jar包到lib目录下二、将自定义依赖包打入jar包方式1、使用springboot自带的插件 一、添加自定义的jar包到lib目录下 参考往期文章&#xff1a;IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖) 二、将自定义依赖包打入jar包 方式1、使用spr…

antd React--如何修改Modal弹出位置

<Modaltitle"人员基本信息配置"visible{personBaseInfoModalVisible}onCancel{handlePersonBaseInfoClose}width{800}footer{[<EButton title{"关闭"} onClick{handlePersonBaseInfoClose}/>]}style{{top: "10px" //调整浮层位置}} >…

windows系统安装异构虚拟机arm版的银河麒麟服务器

下载qemu UEFI&#xff08;BIOS的替代方案&#xff09;的下载地址&#xff1a;http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd QEMU 软件的下载地址&#xff1a;https://qemu.weilnetz.de/w64/2021/qemu-w64-setup-20210505.exe …

Sentinel规则持久化到nacos的实现(源码修改)

文章目录 1、Sentinel源码修改2、持久化效果测试 Sentinel规则管理有三种模式&#xff1a; 原始模式pull模式push模式 这是实现push方式&#xff1a; push模式即控制台将配置规则推送到远程配置中心&#xff0c;例如Nacos。Sentinel客户端去监听Nacos&#xff0c;获取配置变更…