2 条题解

  • 0
    @ 2022-12-6 13:25:25

    按照题意,每次选取一个最小的位置,然后左右递归建树即可,每次选择的根的子树大小就是当前序列的长度。

    void dfs(int l, int r)
    {
        int minPos = l;
        for (int i = l + 1; i <= r; i++)
            if (a[i] < a[minPos])
                minPos = i;
        siz[a[minPos]] = r - l + 1;
        if (minPos > l)
            dfs(l, minPos - 1);
        if (minPos < r)
            dfs(minPos + 1, r);
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        dfs(1, n);
        for (int i = 1; i <= n; i++)
            cout << siz[i] << " ";
        return 0
    }
    
    • 0
      @ 2022-11-20 10:15:34

      子树大小

      拆字符串一样,记录左右边界即可

      #include<bits/stdc++.h>
      using namespace std;
      int n;
      int a[1006];
      int ans[1006];
      int find_min(int l,int r)//区间内最小值下标
      {
      	int num,mm=1e9+9;
      	for(int i=l;i<=r;i++)
      	{
              if(mm>a[i])
              {
                  mm=min(mm,a[i]);
                  num=i;
              }
          }
      	return num;
      }
      void dfs(int l,int r)//搜索记录当前结点子树大小
      {
          if(l>r)return;//边界
          else if(l==r)
          {
              ans[a[l]]=1;
              return;
          }
      	int minn=find_min(l,r);
      	ans[a[minn]]=r-l+1;
          dfs(l,minn-1);//左子树
          dfs(minn+1,r);//右子树
      }
      int main()
      {
      	cin>>n;
      	for(int i=1;i<=n;i++)
      		cin>>a[i]; 
          dfs(1,n);
          for(int i=1;i<=n;i++)
              cout<<ans[i]<<' ';
      	return 0;
      }
      
      
      
      • 1

      信息

      ID
      1137
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      递交数
      8
      已通过
      6
      上传者