算法提高之谜一样的牛

算法提高之谜一样的牛

  • 核心思想:树状数组

    • 初始化树状数组为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;
  }
相关推荐
Coovally AI模型快速验证2 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
mit6.8242 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
pusue_the_sun2 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao343 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng11333 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆4 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路4 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
曙曙学编程5 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
你知道网上冲浪吗5 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
△曉風殘月〆5 小时前
Visual Studio中的常用调试功能(下)
c++·ide·visual studio·调试