算法提高之谜一样的牛

算法提高之谜一样的牛

  • 核心思想:树状数组

    • 初始化树状数组为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;
  }
相关推荐
浅念-10 小时前
C语言文件操作
c语言·c++·经验分享·笔记·学习
Ivanqhz10 小时前
向量化计算
开发语言·c++·后端·算法·支持向量机·rust
一切尽在,你来10 小时前
C++ 零基础教程 - 第 7 讲 bool运算符和选择结构教程
c++
ffqws_10 小时前
进阶搜索:迭代加深搜索(IDS)埃及分数题解
算法·迭代加深
格林威10 小时前
相机的“对焦”和“变焦”,这二者有什么区别?
开发语言·人工智能·数码相机·opencv·算法·计算机视觉·视觉检测
LXS_35710 小时前
常用算法(下)---拷贝、替换、算术生成、集合算法
开发语言·c++·算法·学习方法
历程里程碑10 小时前
Linux19 实现shell基本功能
linux·运维·服务器·算法·elasticsearch·搜索引擎·哈希算法
鲨辣椒1008610 小时前
算法也能降低时间复杂度???—————算法延伸
数据结构·算法·排序算法
你怎么知道我是队长10 小时前
C语言---排序算法5---迭代归并排序法
c语言·算法·排序算法
Yan_uuu10 小时前
ubuntu18.04 安装 x264、ffmpeg、nv-codec-hearers 支持GPU硬件加速
c++·图像处理·ubuntu·ffmpeg