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

news2024/9/24 19:25:05

有 n 头奶牛,已知它们的身高为 1∼n 且各不相同,但不知道每头奶牛的具体身高。

现在这 n 头奶牛站成一列,已知第 i 头牛前面有 Ai 头牛比它低,求每头奶牛的身高。

输入格式
第 1 行:输入整数 n。

第 2…n 行:每行输入一个整数 Ai,第 i 行表示第 i 头牛前面有 Ai 头牛比它低。
(注意:因为第 1 头牛前面没有牛,所以并没有将它列出)

输出格式
输出包含 n 行,每行输出一个整数表示牛的身高。

第 i 行输出第 i 头牛的身高。

数据范围
1≤n≤105
输入样例:
5
1
2
1
0
输出样例:
2
4
5
3
1

分析

  1. 通过样例分析,不能直接确定第一个位置的牛多高,但是可以确定最后一个位置的牛是多高,a[n]=0,k=a[n]+1,说明前面有0头牛比他低,那么最后一头牛的高度就是第k小的数(1~n中未被使用的顺序);
  2. 所以可以使用树状数组维护01序列的前缀和,便于查询k所在位置;从剩余的数中找第k小的数,可以转化为前缀和sum(x)=k这个条件,那么就转化为二分去查找这个满足条件的sum(x);从[1,n]二分x(x就是mid),找到满足条件的x保存在t,然后存进方案ans;记得单点修改t处的值,减1变成0即可;
  3. 在确定牛的身高,是倒着去确定的;并且记得初始化树状数组,因为维护的是01序列,且每个数均为被使用,可以直接初始化为1,而且此题的x也是表示位置,树状数组维护的都是前缀和,所以x一般都是索引;
    在这里插入图片描述
#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 100010;

int n;
int a[N];
int tr[N];//维护01序列的前缀和,便于查询k所在位置
int ans[N];

int lowbit(int x) {
    return x & -x;
}

void add(int x, int c) {
    for (int i = x; i <= n; i += lowbit(i)) {
        tr[i] += c;
    }
}

//区间[1,x]的01序列和
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 = 2; i <= n; ++i) {
        cin >> a[i];
    }
    for (int i = 1; i <= n; ++i) {
        //初始化刚开始 1~n的数都没用过,都是1
        add(i, 1);
    }
    //倒着去确定
    for (int i = n; i; --i) {
        //找没用过的数中,第k小的数
        int k = a[i] + 1;
        int l = 1, r = n;
        int t;//第k小的数所在位置
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if (sum(mid) >= k) {
                t = mid;
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        ans[i] = t;
        //第t个位置的数-1,变成了0,代表已用过
        add(t, -1);
    }
    for (int i = 1; i <= n; ++i) {
        cout << ans[i] << endl;
    }
    return 0;
}

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

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

相关文章

Linux——组管理和权限管理

Linux组 基本介绍 在Linux中的每个用户必须属于一个组&#xff0c;不能独立于组外&#xff0c;在Linux中每个文件有所有者&#xff0c;所在组&#xff0c;其他组的概念。 所有者 一般为文件的创建者&#xff0c;谁创建了该文件&#xff0c;就自然的成为该文件的所有者。 查…

构造序列(模拟构造)

请你构造一个 01 序列&#xff0c;序列需要满足以下所有要求&#xff1a; 恰好包含 n 个 0 和 m 个 1。不存在两个或两个以上的 0 连续相邻。不存在三个或三个以上的 1 连续相邻。 输入格式 共一行&#xff0c;包含两个整数 n,m。 输出格式 输出共一行&#xff0c;如果存在…

【js记录】递归进行深拷贝时对于Object遍历方法的思考【深浅拷贝+object县官属性介绍+类型判断方法+for...in+for...of】

一、 前言&#xff1a;本文使用的 类型判断方法介绍 通过手写instaceof更好理解其作用及使用 1、 typeof 判断一个实例属于哪种类型 2、 instance 判断一个实例是否属于某种类型let person function(){ } let no new person(); no instanceof person; // true3、 原型…

IT分销商未来在哪里?南京创瑞丰向复合型产品方案商转型

在一个充满不确定性的市场中&#xff0c;思变求新是企业的唯一出路。 诚如IT分销领域&#xff0c;云计算、大数据、人工智能等技术的兴起&#xff0c;加速企业数字化转型的同时&#xff0c;亦对于传统IT分销市场的未来产生了深远影响。过去“搬箱子”、打价格战的方式方法正在…

Python中文件操作(读、写、关闭)

目录 一.什么是文件 二.python文件操作 1.open&#xff08;&#xff09;打开函数 注意 mode常用的三种基础访问模式 2.读操作相关方法 read&#xff08;&#xff09;方法&#xff1a; readlines&#xff08;&#xff09;方法: readline&#xff08;&#xff09;方法 for…

Linux性能学习(1.1):CPU_CPU缓存

文章目录1 简介2 工作机制3 Cache Line参考资料&#xff1a; 1. https://www.makeuseof.com/tag/what-is-cpu-cache/ 2. https://zhuanlan.zhihu.com/p/80672073 3.CPU Cache 机制以及 Cache miss 4.性能优化方法和技巧 在日常的嵌入式开发中&#xff0c;查看一些SOC的datashe…

想学习编程,该怎么开始,需要多长时间?

想学习编程,该怎么开始&#xff0c;需要多长时间&#xff1f; 其实学编程也没有啥特别的方法&#xff0c;和我们没基础学驾照差不多。 考A照、B照还是C照&#xff0c;我们先得拎清&#xff0c;它们的用途存在一定差异 。一样的&#xff0c;学编程是学C&#xff0c;Java、Pyth…

命令行在服务器的Oracle新建、修改用户并授权

1.前提解说 由于我是使用docker拉取的Oracle,这里截图的Oracle用户是原本安装好的Oracle用户。 2.步骤 1.Linux服务器切换到Oracle su oracle 2. 进入SQL sqlplus / as sysdba 3.新建用户(一定要加“&#xff1b;”) create user 用户名 identified by 密码&#xff1b; 若是修…

Tableau可视化设计案例-02Tableau数据处理、折线图

文章目录Tableau可视化设计案例02Tableau数据处理、折线图1.数据前处理2.绘制折线图2.1 创建电影数据变化折线图2.2创建电影票房变化折线图2.3 20215年的电影数量与票房比较分析Tableau可视化设计案例 本文是Tableau的案例&#xff0c;为B站视频的笔记&#xff0c;B站视频 参考…

Java集合/泛型面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

作为文科生,如何才能学好一门编程语言?

学习新知识的过程总是痛苦和逆人性的&#xff0c;古往今来皆是如此&#xff0c;否则也不会有十年寒窗苦读一说。 相信此刻看这篇文章的你&#xff0c;经历的寒窗绝对不止十年。 从小学开始算起到大学毕业&#xff0c;绝大多数人起码经历了16年&#xff08;跳级的神童与学霸除…

5G无线技术基础自学系列 | 单站点验证测试

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 单站点验证工作是通过测试来进行功能性…

二级MS Office真题第8套完整解析

全国计算机等级考试二级新增预测第一套 一、文字处理 公司将于今年举办“创新产品展示说明会”&#xff0c;市场部助理小王需要将会议邀请函制作完 成&#xff0c;并寄送给相关的客户。现在&#xff0c;请你按照如下需求&#xff0c;在Word.docx文档中完成制作工作&#xff1a;…

非零基础自学Golang 第11章 文件操作 11.1 目录基本操作 11.1.1 列目录

非零基础自学Golang 文章目录非零基础自学Golang第11章 文件操作11.1 目录基本操作11.1.1 列目录第11章 文件操作 计算机文件是以硬盘为载体的信息存储集合&#xff0c;文件可以是文本、图片、程序等。在编写程序时&#xff0c;我们经常会和文件打交道&#xff0c;比如从文件读…

推送github一直超时以及输入密码提示2021年8月以后密码不能用解决

最近推送github常常出现443端口超时&#xff0c;查询了很多办法最后用了如下方法解决 首先电脑设置里面搜索代理服务器设置&#xff0c;记住这个端口 用上面的地址和端口运行如下命令 git config --global http.proxy http://127.0.0.1:31181 git config --global https.pro…

小学生C++画图 Go C 编程 第8课 魔法计时器(魔法学院的奇幻之旅 Go C编程绘图)

Goc编程第一课 Goc编程第一课_哔哩哔哩_bilibili Goc编程第一课扩展加复习 Goc编程第一课扩展加复习_哔哩哔哩_bilibili Goc编程第二课 Goc编程第二课_哔哩哔哩_bilibili Goc编程第三课 Goc编程第三课_哔哩哔哩_bilibili Goc编程第四课 Goc编程第四课_哔哩哔哩_bilibili G…

JSCharting JavaScript 3.3.X 12/17/2022 Crack

JSCharting JavaScript 图表库 每个 JSCharting 许可证包括全套 150 多种高级图表类型以及交互式股票图表、无缝网格和日历支持、JavaScript 地图、甘特图、JavaScript 组织结构图和微型图表,企鹅Ω578867473。 画廊 在每台设备上满足每一种需求的图表类型&#xff01; 包括条形…

【前端开发学习】6.MySQL

文章目录1 MySQL 指令1.1 数据库管理&#xff08;文件夹&#xff09;1.2 数据表管理&#xff08;文件&#xff09;1.3 数据行操作总结2 案例&#xff1a;员工管理2.1 创建表结构2.2 Python 操作 MySQL1. 创建数据2. 查询数据3. 删除4. 修改总结3 案例&#xff1a; Flask 前端 …

JVM类加载/双亲委派模型

类加载是一个复杂的过程, 那么我们平时说的类加载到底是干啥的呢? 一. 类加载是干啥的 我们都知道Java程序在运行之前, 需要进行编译, 由 .java > .class文件(二进制字节码文件) , 而在运行的时候呢, Java进程(JVM), 就会读取对应的 .class文件, 并且解析他的内容, 在内存…