算法提高之谜一样的牛

算法提高之谜一样的牛

  • 核心思想:树状数组

    • 初始化树状数组为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;
  }
相关推荐
唐诺2 小时前
几种广泛使用的 C++ 编译器
c++·编译器
XH华2 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_2 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子3 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
冷眼看人间恩怨3 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
菜鸡中的奋斗鸡→挣扎鸡3 小时前
滑动窗口 + 算法复习
数据结构·算法
红龙创客3 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin3 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码3 小时前
Cmd命令大全(万字详细版)
python·算法·小程序