P3365 改造二叉树
Posted HWIM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3365 改造二叉树相关的知识,希望对你有一定的参考价值。
分析:
求出中序遍历后,然后使其变成上升子序列。过程:每个点减去坐标,然后nlogn求出最长不下降子序列,n-ans即答案。
做题时一直认为二叉树就是完全二叉树,然后一直MLE。。。
代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 #include<cctype> 7 8 using namespace std; 9 10 const int N = 100100; 11 12 int ls[N],rs[N],w[N],q[N],T[N],f[N]; 13 int tot; 14 15 inline int read() { 16 int x = 0,f = 1;char ch = getchar(); 17 for (; !isdigit(ch); ch=getchar()) if (ch==‘-‘) f=-1; 18 for (; isdigit(ch); ch=getchar()) x = x*10+ch-‘0‘; 19 return x * f; 20 } 21 void dfs(int u) { 22 if (!u) return ; 23 // if (!ls[u] && !rs[u]) {q[++tot] = u;return; } 24 dfs(ls[u]); 25 q[++tot] = u; 26 dfs(rs[u]); 27 } 28 29 int main() { 30 31 int n = read(); 32 for (int i=1; i<=n; ++i) w[i] = read(); 33 for (int i=2; i<=n; ++i) { 34 int faa = read(),p = read(); 35 if (p == 0) ls[faa] = i; 36 else rs[faa] = i; 37 } 38 dfs(1); 39 for (int i=1; i<=n; ++i) { 40 T[i] = w[q[i]] - i; 41 } 42 int len = 1; 43 f[1] = T[1]; 44 for (int i=2; i<=n; ++i) { 45 if (T[i] >= f[len]) f[++len] = T[i]; 46 else { 47 int pos = upper_bound(f+1,f+len+1,T[i]) - f; 48 f[pos] = min(f[pos],T[i]); 49 } 50 } 51 cout << n - len; 52 return 0; 53 }
以上是关于P3365 改造二叉树的主要内容,如果未能解决你的问题,请参考以下文章