P3365 改造二叉树

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 }

 

posted @ 2018-06-03 19:26  MJT12044  阅读(150)  评论(0编辑  收藏  举报