2 条题解
-
0
按照题意,每次选取一个最小的位置,然后左右递归建树即可,每次选择的根的子树大小就是当前序列的长度。
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
子树大小
拆字符串一样,记录左右边界即可
#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
- 上传者