算法提高之谜一样的牛

算法提高之谜一样的牛

  • 核心思想:树状数组

    • 初始化树状数组为1 表示所有高度都没有用过
    • 从后往前遍历h数组 分析身高
      • 取当前h,即前面有h个比它高的 所以它是第h+1个数
      • 求当前身高中 第h+1个数
    • 用二分mid求sum找到第k个数
    • 当前身高用过之后减1
cpp 复制代码
  #include <iostream>
  #include <cstring>
  #include <algorithm>
  
  using namespace std;
  const int N = 1e5 + 10;
  
  int n;
  int h[N];
  int ans[N];
  int tr[N];
  
  int lowbit(int x)
  {
      return x&-x;
  }
  int sum(int x)
  {
      int res=0;
      for(int i=x;i;i-=lowbit(i)) res += tr[i];
      return res;
  }
  void add(int x,int c)
  {
      for(int i=x;i<=n;i+=lowbit(i)) tr[i] += c;
  }
  
  int main()
  {
      cin>>n;
      for(int i=2;i<=n;i++) cin>>h[i];
      for(int i=1;i<=n;i++) add(i,1);  //每个位置+1
      
      for(int i=n;i;i--)
      {
          int k = h[i] + 1;
          int l=1,r=n;
          while(l<r)
          {
              int mid = l+r>>1;
              if(sum(mid) >= k) r = mid;
              else l = mid+1;
          }
          ans[i] = r;  //r为第k个身高
          add(r,-1);
      }
      for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
  }
相关推荐
蒙奇D索大几秒前
【算法】 递归实战应用:从暴力迭代到快速幂的优化之路
笔记·考研·算法·改行学it
Miraitowa_cheems1 分钟前
LeetCode算法日记 - Day 101: 最长公共子序列
数据结构·算法·leetcode·深度优先·动态规划
DuHz6 分钟前
基于信号分解的FMCW雷达相互干扰抑制——论文阅读
论文阅读·算法·汽车·信息与通信·毫米波雷达
9ilk11 分钟前
【仿RabbitMQ的发布订阅式消息队列】 ---- 功能测试联调
linux·服务器·c++·分布式·学习·rabbitmq
北冥湖畔的燕雀14 分钟前
std之list
数据结构·c++·list
徐行tag29 分钟前
RLS(递归最小二乘)算法详解
人工智能·算法·机器学习
Elias不吃糖1 小时前
eventfd 初认识Reactor/多线程服务器的关键唤醒机制
linux·服务器·c++·学习
南方的狮子先生1 小时前
【C++】C++文件读写
java·开发语言·数据结构·c++·算法·1024程序员节
Alex艾力的IT数字空间1 小时前
完整事务性能瓶颈分析案例:支付系统事务雪崩优化
开发语言·数据结构·数据库·分布式·算法·中间件·php
玖剹2 小时前
二叉树递归题目(一)
c语言·c++·算法·leetcode