改造二叉树
2017-08-12 21:39
148 查看
输入
32 2 2
1 0
1 1
输出
2提示
二叉搜索树的中序遍历是一个从小到大的序列,先先中序遍历得到新的序列b[i],然后对于j>=i,需要满足f[j]-f[i]>=j-i 即f[j]-j>=f[i]-i;然后规定g[i]=f[i]-i;那么不用变换的位置g[i]呈不下降序列,求出g[i]的最长不下降序列,然后用n-len
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
#define maxn 100005
using namespace std;
int n,cnt=0;
LL f[maxn],g[maxn],Maxl;
int fa[maxn],son[maxn][3];
LL a[maxn],b[maxn];
bool w[maxn];
void dfs(int x)
{
if(!x) return ;
dfs(son[x][0]);
b[++cnt]=a[x];
dfs(son[x][1]);
}
inline LL getmax(LL x)
{
for(int i=Maxl;i>=0;i--)
if(b[g[i]]<=x) return i;
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=2;i<=n;i++){
scanf("%d%d",&fa[i],&w[i]);
son[fa[i]][w[i]]=i;
}
dfs(1);
for(int i=1;i<=n;i++) b[i]=b[i]-(LL)i;
for(int i=1;i<=n;i++){
f[i]=getmax(b[i])+1;
if(g[f[i]]==0) g[f[i]]=i;
else if(b[i]<b[g[f[i]]]) g[f[i]]=i;
Maxl=max(Maxl,f[i]);
}
LL ans=0;
for(int i=1;i<=n;i++) ans=max(ans,f[i]);
printf("%d\n",n-ans);
return 0;
}
相关文章推荐
- 洛谷 P3365 改造二叉树
- 洛谷3365:改造二叉树——题解
- P3365 改造二叉树
- Jzoj3894 改造二叉树
- 二叉树层次遍历的应用--改造二叉链表
- 改造二叉树 (Tree+LTS)
- 10.26最后的模拟DAY2 改造二叉树[中序遍历+严格递增的最长不下降子序列]
- NOIp模拟赛-改造二叉树
- 改造二叉树 (长乐一中模拟赛day2T1)
- 改造二叉树_纪中3894_dfs+LIS
- 改造二叉树(lis+中序遍历)
- 瞎搞DP 改造二叉树
- P3365 改造二叉树
- 改造二叉树
- 模拟赛 改造二叉树(时间限制 1s;空间限制 256M)
- 【NOIP 模拟赛】改造二叉树 最长上升子序列
- 洛谷 3365 改造二叉树(中序遍历+LIS)
- 【NOIP2003提高组】加分二叉树
- 数据结构学习笔记——二叉树的存储结构
- 二叉树的遍历