算法提高之谜一样的牛

算法提高之谜一样的牛

  • 核心思想:树状数组

    • 初始化树状数组为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;
  }
相关推荐
Once_day7 分钟前
代码训练LeetCode(23)随机访问元素
算法·leetcode
小河豚oO23 分钟前
LeetCode 热题 100 - 哈希 - 128
算法·leetcode·哈希算法
客卿12324 分钟前
力扣100题之128. 最长连续序列
算法·leetcode·哈希算法
T1an-124 分钟前
【力扣链表篇】206.反转链表
算法·leetcode·链表
码农开荒路1 小时前
Redis底层数据结构之字典(Dict)
java·数据结构·数据库·redis
xphjj2 小时前
树形数据模糊搜索
前端·javascript·算法
yxc_inspire2 小时前
基于Qt的app开发第十三天
c++·qt·app·tcp·面向对象
Once_day2 小时前
代码训练LeetCode(24)数组乘积
算法·leetcode
虾球xz2 小时前
CppCon 2015 学习:Concurrency TS Editor’s Report
开发语言·c++·学习
潇-xiao2 小时前
Qt 按钮类控件(Push Button 与 Radio Button)(1)
c++·qt