Educational Codeforces Round 97 (Rated for Div. 2)D. Minimal Height Tree
题意
给你一个bfs
序列让你还原树,求树的最大深度。
需要注意的是给你的序列中如果是升序的那么他们是属于一个父亲的。
思路
建图模拟整个过程。
整个代码中最细节的是
if(a[j]<a[j-1]){
q.push(a[j]),edge[u].push_back(a[j]);++j;
}
保证了可以考虑到每一种情况。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn],dep[maxn];
vector<int>edge[maxn];
void dfs(int u,int fa){
dep[u]=dep[fa]+1;
for(auto v:edge[u]){
dfs(v,u);
}
}
void solve() {
int n;cin>>n;
for(int i=1;i<=n;++i)cin>>a[i];
queue<int>q;
int j=2;
q.push(1);
while(!q.empty()&&j<=n) {
int u = q.front();q.pop();
if(a[j]<a[j-1]){
q.push(a[j]),edge[u].push_back(a[j]);++j;
}
while(a[j]>a[j-1]&&j<=n)q.push(a[j]),edge[u].push_back(a[j]),++j;
}
dfs(1,0);
int ans=0;
for(int i=1;i<=n;++i)ans=max(ans,dep[i]);
cout<<ans-1<<endl;
for(int i=0;i<=n;++i){
edge[i].clear();dep[i]=0;
}
}
int main() {
int t;
cin>>t;
while(t--) {
solve();
}
}
数组模拟 (滑稽yyds
cnt
为上一层的所有父节点个数,last为上一层还有几个父节点可以用。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn];
void solve() {
int n;cin>>n;
for(int i=1;i<=n;++i)cin>>a[i];
int cnt=0,last=1,dep=0;
for(int i=2;i<=n;++i){
if(a[i]<a[i-1]){
if(--last==0){
last=cnt;
++dep;
cnt=0;
}
}
++cnt;
}
cout << dep + 1 << endl;
}
int main() {
int t;
cin>>t;
while(t--) {
solve();
}
}