2 条题解

  • 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;
    }
    
    
    

    信息

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